Effective Perl その3

Effective Perl (ASCII Addison Wesley Programming Series)

第5章 リファレンス

わかりやすかったので覚書きはなし。

40項 まとめて大量のデバッグをしない

何事も「鵜呑み」にしてはならない

どうにもうまくいかないバグに対したら、トイレに行くとか、休憩をとるとか、体操をするとか、帰って明日やるとか、視点の変換が大切ですよね。

第7章 パッケージとモジュールの使い方
第8章 パッケージとモジュールの書き方

ここらへんは今はいいや。必要になったときに。

49項 Perlオブジェクト指向プログラミング機能を使ってみよう

blessについては昨日書いたんで。

50項 Perlのメソッド継承を理解しよう

@ISAで継承ですか。でも@ISAって、strictだと怒られるな。
サブルーチン名が被ってるだけでオーバーライドになるのか。シグネチャの違い、というかシグネチャがないから当たり前か。

AUTOLOADとUNIVERSAL

AUTOLOADはメソッドコールの構文*1で存在しないサブルーチンが呼ばれたときに拾ってくれるのか。

package Parent;
sub new { bless {}, shift }

sub AUTOLOAD {
 print "auto $AUTOLOAD\n";
 print "@_\n";
}

sub DESTROY {
 print 'DESTROYERRRRRRRRRR';
}

package UNIVERSAL;

sub AUTOLOAD {
 print "universal autoload $AUTOLOAD\n";
}

package Child;
@ISA = qw(Parent);

package main;
my $child = new Child;
$child->foo( 'bar', 'baz' );
auto Child::foo
Child=HASH(0x16252a8) bar baz
DESTROYERRRRRRRRRR

きっちりDESTROYされるとUNIVERSALのは働かないのか。
でも、$AUTOLOADもstrictだと怒られるな。どうするんだろ。実際の使ってる例をみればいいのか。

51項 データを明示的に継承する
package Parent;
sub new {
  my $pkg = shift;
  bless {
    foo => 1,
    bar => 'abc',
    @_
  }, $pkg;
}

引数でハッシュで渡すようにしとけば、デフォルト値を使えるんだよな。

package Child;
@ISA = qw( Parent );
sub new {
  my $pkg = shift;
  SUPER::new $pkg {
    foo => 1,
    bar => 'abc',
    @_
  };
}

これでデータの継承もできるのか。んー、違和感を感じるのは理解しきれてないからかな。

56項 ファイルテスト演算子を忘れるな

これも演算子なのか…。

$size = -s $filename;

たしかに楽でわかりやすい。

60項 粋な1行野郎ども
あるものと別のものをマッチさせる
/^(?=.*?this)(?=.*?that)/
リストからエントリの重複を排除する
my @uniq = sort keys %{ { map { $_, 1 } @list } };

mapでキーに要素を持ったハッシュを作って直ぐにキーを返してる。リストの順番は保持されないけどね。

行データからペアの形で連結する
perl -pe 's/\n/ " " . <>/e' data

ダイヤモンド演算子で次の行を持ってきちゃうのか。すごいな。

*1:オブジェクト->サブルーチン みたいな