† Perl Beginners #15 † 
申し訳程度にPerl OOP 
での質問をします 
ほかは謎便利ツール?紹介 
2014/10/7 
大野義貴(CL)
私 
⿟⿟大野義貴(CL) twitter @CLCLCL 
⿟⿟五反田の派遣・アポイントマッチング会社のサーバエ 
ンジニア 
⿟⿟2000年くらいから地方の印刷屋でPerlやっていた 
⿟⿟iモードコンテンツ屋さんがHTTPで206 Partial 
Contentで戦っていたころ印刷屋さんではPDFのペー 
ジ毎分割配信で206と戦っていた 
⿟⿟CPAN Author流行ってた頃ノリでCPAN Author 
⿟⿟最近転職して東京出てきた
便利ツール 
を置く場所
CentOSのrootユーザはデ 
フォルトだと/root/binに 
pathが通っているからログ 
フィルタ系の便利ツールっ 
てPerlで作ったりするけれ 
ども/root/binをmkdirし 
たりしてそこに置くといいん 
じゃないかな(サーバ引越し 
時に紛失しにくい)root作 
業の是非の判断は置いておく
便利ツール
Arduino UNIX時間時計 
Perl無しで使える→便利! 
2038年問題をいやでも意 
識する→便利! 
UNIXエポックとか知識ある 
人が周囲にいないと変な目で 
見られる→便利!
便利ツール 
その2
Raspberry Pi AnyEvent::Twitter::Streamクライアント
Raspberry Pi AnyEvent::Twitter::Streamクライアント 
ストリーミング→便利! 
TL内の秒あたりツイート数表 
示→勢いが見られて便利! 
ふぁぼられたりメンション来 
ると色が変わる→便利! 
VoiceText読み上げ→便利!
今回はこのハードの 
Perlプログラムで 
質問が有り〼ハード 
あまり関係無いが
from Adafruit_I2C import Adafruit_I2C 
from time import sleep 
class Adafruit_CharLCDPlate(Adafruit_I2C): 
# --------------------------------------------- 
# Constructor 
def __init__(self, busnum=-1, 
addr=0x20, debug=False): 
self.i2c = Adafruit_I2C(addr, busnum, debug) 
[snip] 
self.displayshift = (self.LCD_CURSORMOVE | self.LCD_MOVERIGHT) 
self.displaymode = (self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT) 
self.displaycontrol = (self.LCD_DISPLAYON|self.LCD_CURSOROFF|self.LCD_BLINKOFF) 
self.write(0x33) # Init 
self.write(0x32) # Init 
self.write(0x28) # 2 line 5x8 matrix 
self.write(self.LCD_CLEARDISPLAY) 
self.write(self.LCD_CURSORSHIFT|self.displayshift) 
self.write(self.LCD_ENTRYMODESET 
| self.displaymode) 
self.write(self.LCD_DISPLAYCONTROL 
| self.displaycontrol) 
self.write(self.LCD_RETURNHOME) 
# --------------------------------------------- 
# Write operations 
def write(self, value, char_mode=False): 
""" Send command/data to LCD """ 
[snip] 
液晶モジュール 
表示用プログラ 
ム:オリジナル 
はPython 
オブジェクトの 
コンストラクタ 
(初期化)部分 
で、メンバ関数 
を呼んでいる
package Adafruit_CharLCDPlate; 
use HiPi::Device::I2C; use HiPi::BCM2835::I2C; 
# ------------------------------------------------------ 
# Constructor 
sub new { 
my $class = shift; my %args = ( @_ ); my $self = {}; 
$self->{addr}= 0x20; 
$self->{i2c} = HiPi::Device::I2C 
->new(address => $self->{addr}); 
$self->{i2c}->smbus_write_byte_data(MCP23017_IOCON_BANK0, 0b10100000); 
$self->{displayshift} = (LCD_CURSORMOVE|LCD_MOVERIGHT); 
$self->{displaymode} = (LCD_ENTRYLEFT |LCD_ENTRYSHIFTDECREMENT); 
$self->{displaycontrol} = (LCD_DISPLAYON |LCD_CURSOROFF|LCD_BLINKOFF); 
return bless $self, $class; 
} 
# Constructor_2 
sub init { 
my $self = shift; 
$self->write(0x33); # Init 
$self->write(0x32); # Init 
$self->write(0x28); # 2 line 5x8 matrix 
$self->write(LCD_CLEARDISPLAY); 
$self->write(LCD_CURSORSHIFT |$self->{displayshift}); 
$self->write(LCD_ENTRYMODESET|$self->{displaymode}); 
$self->write(LCD_DISPLAYCONTROL|$self->{displaycontrol}); 
$self->write(LCD_RETURNHOME); 
} 
# ------------------------------------------------------ 
# Write operations 
sub write { 
my $self = shift; 
[snip] 
} 
液晶モジュール表示 
ライブラリを、 
Pythonから 
Perlにオレオレ移植 
オブジェクトのコン 
ストラクタ(初期化) 
部分でメンバ関数を 
呼べないので、オブ 
ジェクト生成後、 
$obj->init() 
を別口で呼ぶことで 
メンバ関数を利用
質問の 
まとめ
PerlのOOPにおいて、コンストラクタ 
内でメンバ関数を呼ぶ方法はないか? 
質問 
my $obj = HOGE->new(); 
$obj->write('done.'); 
exit; 
package HOGE; 
sub new { # Constructor 
my $class = shift; 
my $self = {}; 
$self->write('init...'); # ERROR!! 
return bless $self, $class; 
} 
sub write { # Member function 
my $self = shift; 
my $str = shift; 
print "$strn"; 
}
blessを変数に入れておいて、後で変数を 
returnする 
解決 
my $obj = HOGE->new(); 
$obj->write('done.'); 
exit; 
package HOGE; 
sub new { # Constructor 
my $class = shift; 
my $self = {}; 
my $obj = bless $self, $class; 
$self->write('init...'); #PASS! 
return $obj; 
} 
sub write { # Member function 
my $self = shift; 
my $str = shift; 
print "$strn"; 
}

PerlのOOPにおいて、コンストラクタ 内でメンバ関数を呼ぶ方法は?(Perl Beginners #15)

  • 1.
     † Perl Beginners#15 † 申し訳程度にPerl OOP での質問をします ほかは謎便利ツール?紹介 2014/10/7 大野義貴(CL)
  • 2.
    私 ⿟⿟大野義貴(CL) twitter@CLCLCL ⿟⿟五反田の派遣・アポイントマッチング会社のサーバエ ンジニア ⿟⿟2000年くらいから地方の印刷屋でPerlやっていた ⿟⿟iモードコンテンツ屋さんがHTTPで206 Partial Contentで戦っていたころ印刷屋さんではPDFのペー ジ毎分割配信で206と戦っていた ⿟⿟CPAN Author流行ってた頃ノリでCPAN Author ⿟⿟最近転職して東京出てきた
  • 3.
  • 4.
    CentOSのrootユーザはデ フォルトだと/root/binに pathが通っているからログ フィルタ系の便利ツールっ てPerlで作ったりするけれ ども/root/binをmkdirし たりしてそこに置くといいん じゃないかな(サーバ引越し 時に紛失しにくい)root作 業の是非の判断は置いておく
  • 5.
  • 6.
    Arduino UNIX時間時計 Perl無しで使える→便利! 2038年問題をいやでも意 識する→便利! UNIXエポックとか知識ある 人が周囲にいないと変な目で 見られる→便利!
  • 7.
  • 8.
  • 9.
    Raspberry Pi AnyEvent::Twitter::Streamクライアント ストリーミング→便利! TL内の秒あたりツイート数表 示→勢いが見られて便利! ふぁぼられたりメンション来 ると色が変わる→便利! VoiceText読み上げ→便利!
  • 10.
  • 11.
    from Adafruit_I2C importAdafruit_I2C from time import sleep class Adafruit_CharLCDPlate(Adafruit_I2C): # --------------------------------------------- # Constructor def __init__(self, busnum=-1, addr=0x20, debug=False): self.i2c = Adafruit_I2C(addr, busnum, debug) [snip] self.displayshift = (self.LCD_CURSORMOVE | self.LCD_MOVERIGHT) self.displaymode = (self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT) self.displaycontrol = (self.LCD_DISPLAYON|self.LCD_CURSOROFF|self.LCD_BLINKOFF) self.write(0x33) # Init self.write(0x32) # Init self.write(0x28) # 2 line 5x8 matrix self.write(self.LCD_CLEARDISPLAY) self.write(self.LCD_CURSORSHIFT|self.displayshift) self.write(self.LCD_ENTRYMODESET | self.displaymode) self.write(self.LCD_DISPLAYCONTROL | self.displaycontrol) self.write(self.LCD_RETURNHOME) # --------------------------------------------- # Write operations def write(self, value, char_mode=False): """ Send command/data to LCD """ [snip] 液晶モジュール 表示用プログラ ム:オリジナル はPython オブジェクトの コンストラクタ (初期化)部分 で、メンバ関数 を呼んでいる
  • 12.
    package Adafruit_CharLCDPlate; useHiPi::Device::I2C; use HiPi::BCM2835::I2C; # ------------------------------------------------------ # Constructor sub new { my $class = shift; my %args = ( @_ ); my $self = {}; $self->{addr}= 0x20; $self->{i2c} = HiPi::Device::I2C ->new(address => $self->{addr}); $self->{i2c}->smbus_write_byte_data(MCP23017_IOCON_BANK0, 0b10100000); $self->{displayshift} = (LCD_CURSORMOVE|LCD_MOVERIGHT); $self->{displaymode} = (LCD_ENTRYLEFT |LCD_ENTRYSHIFTDECREMENT); $self->{displaycontrol} = (LCD_DISPLAYON |LCD_CURSOROFF|LCD_BLINKOFF); return bless $self, $class; } # Constructor_2 sub init { my $self = shift; $self->write(0x33); # Init $self->write(0x32); # Init $self->write(0x28); # 2 line 5x8 matrix $self->write(LCD_CLEARDISPLAY); $self->write(LCD_CURSORSHIFT |$self->{displayshift}); $self->write(LCD_ENTRYMODESET|$self->{displaymode}); $self->write(LCD_DISPLAYCONTROL|$self->{displaycontrol}); $self->write(LCD_RETURNHOME); } # ------------------------------------------------------ # Write operations sub write { my $self = shift; [snip] } 液晶モジュール表示 ライブラリを、 Pythonから Perlにオレオレ移植 オブジェクトのコン ストラクタ(初期化) 部分でメンバ関数を 呼べないので、オブ ジェクト生成後、 $obj->init() を別口で呼ぶことで メンバ関数を利用
  • 13.
  • 14.
    PerlのOOPにおいて、コンストラクタ 内でメンバ関数を呼ぶ方法はないか? 質問 my $obj = HOGE->new(); $obj->write('done.'); exit; package HOGE; sub new { # Constructor my $class = shift; my $self = {}; $self->write('init...'); # ERROR!! return bless $self, $class; } sub write { # Member function my $self = shift; my $str = shift; print "$strn"; }
  • 16.
    blessを変数に入れておいて、後で変数を returnする 解決 my $obj = HOGE->new(); $obj->write('done.'); exit; package HOGE; sub new { # Constructor my $class = shift; my $self = {}; my $obj = bless $self, $class; $self->write('init...'); #PASS! return $obj; } sub write { # Member function my $self = shift; my $str = shift; print "$strn"; }