16
申し訳程度に Perl OOP での質問をします ほかは謎便利ツール?紹介 2014/10/7 大 野 義 貴(CL) † Perl Beginners #15 †

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

  • Upload
    cl0cl

  • View
    941

  • Download
    9

Embed Size (px)

DESCRIPTION

PythonのライブラリをPerlに移植したとき、bless前にメンバ関数が使えない。どうしよう? http://www.perl-beginners.org/2014/09/perl-beginners-15.html

Citation preview

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

申し訳程度に Perl OOPでの質問をします

ほかは謎便利ツール?紹介

2014/10/7

大野義貴(CL)

 † Perl Beginners #15 †

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

大野義貴(CL) twitter @CLCLCL

五反田の派遣・アポイントマッチング会社のサーバエ ンジニア

2000年くらいから地方の印刷屋でPerlやっていた

iモ ー ド コ ン テ ン ツ 屋 さ ん がHTTPで206 Partial Contentで戦っていたころ印刷屋さんではPDFのページ毎分割配信で206と戦っていた

CPAN Author流行ってた頃ノリでCPAN Author

最近転職して東京出てきた

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

便利ツールを置く場所

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

CentOSのrootユーザはデフ ォ ル ト だ と/root/binにpathが通っているからログフィルタ系の便利ツールってPerlで作ったりするけれど も/root/binをmkdirしたりしてそこに置くといいんじゃないかな(サーバ引越し時に紛失しにくい)root作業の是非の判断は置いておく

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

便利ツール

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

Arduino UNIX時間時計Perl無しで使える→便利!2038年問題をいやでも意識する→便利!UNIXエポックとか知識ある人が周囲にいないと変な目で見られる→便利!

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

便利ツールその2

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

Raspberry Pi AnyEvent::Twitter::Streamクライアント

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

Raspberry Pi AnyEvent::Twitter::Streamクライアント

ストリーミング→便利!TL内の秒あたりツイート数表示→勢いが見られて便利!ふぁぼられたりメンション来ると色が変わる→便利!VoiceText読み上げ→便利!

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

今回はこのハードのPerlプログラムで質問が有り〼ハードあまり関係無いが

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

from Adafruit_I2C import Adafruit_I2Cfrom 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

オブジェクトのコンストラクタ

(初期化)部分で、メンバ関数を呼んでいる

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

package Adafruit_CharLCDPlate;use HiPi::Device::I2C; use HiPi::BCM2835::I2C;# ------------------------------------------------------# Constructorsub 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_2sub 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 operationssub write { my $self = shift; [snip]}

液晶モジュール表示ライブラリを、PythonからPerlにオレオレ移植

オブジェクトのコンストラクタ(初期化)部分でメンバ関数を呼べないので、オブジェクト生成後、$obj->init()を別口で呼ぶことでメンバ関数を利用

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

質問のまとめ

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

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 "$str\n";}

質問

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

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 "$str\n";}

解決