bk-perl

[トップ][一覧][最近の更新]

orの優先度は低い

perl -le 'my $a = 0 or 1; print $a'
=> 0
perl -le 'my $a = 0 || 1; print $a'
=> 1

何も考えずに書くと、秘かに狂った結果が出ていて、きっと痛い目に遭う。

しかし、perlは、何も考えずに書けるように、そして、コードを読む方はあまり重視されない方向性でこれまで使われてきた言語である。

勿論、読みやすく書く努力はperlでも可能だが……。

危険な正規表現

 "hoge" =~ /^hoge$/
 "hoge\n" =~ /^hoge$/
 "hoge\n" =~ /^hoge\z/

perlスクリプトをプロファイリング

 perl -d:DProf スクリプトファイル名
 dprofpp tmon.out

execの罠と利用法

localを使って、動的スコープを実現できる

gotoの魔術的用法

 goto &hoge;
 goto \&hoge;
 my $sub = sub { ‥… }; # 予め無名関数を作っておき、
 goto $sub; # 関数refでgotoする

refスライス

 my $hashref = { aaa => 123, bbb => 456, ccc => 789, };
 my $values = [ @{$hashref}{qw[ aaa ccc ]} ];
 my $arrayref = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
 my $values = [ @{$arrayref}[3..7] ];

シグナルハンドラの操作

 local $SIG{TERM} = \&killDelayed;

省略とscalar/listの罠

 sub hoge { return; }
 my ($a, $b, $c) = (1, hoge(), 2);
 # $aには1が入るが、$bには2が入り、$cはundefとなる

間接オブジェクト記法の罠(perl_quizより)

 print (1+3)*2;
 # この結果は8ではなく4になる。つまり、以下のように認識されている。
 # (print(1+3))*2;
 # エラーが出ないので、発見しづらい。要注意。

間接オブジェクト記法の罠その二

 use IO::Handle;
 print STDOUT "hoge\n"; # 正しい。
 my $fh = \*STDOUT;
 print $fh "fuge\n"; # 正しい。
 my $this = { fh => \*STDOUT };
 # print $this->{fh} "mage\n"; # コレは正しくない!!!
 # 正しくするには、次の二つのどちらかにする
 print {$this->{fh}} "mage\n"; # 間接オブジェクト記法
 $this->{fh}->print("mage\n"); # 矢印オブジェクト記法


perlは、はまりポイントの多さは、rubyやpythonの比では無い、と、仕事で使っていて、常日頃から思っていた。

仕事では、まだperlを業務としては使ってはいるものの、「perlは、一生使っていける言語か?」という問いに対して、自分は少なくとも「yes」とは絶対に答えられない(※perl6は含まない、という事で)。

そして、言語とは、何年も使わなくてはマスターできないものである、という話であり、自分もそれを体感している。

それならば、将来には使わなくなるような言語は早く捨てて、将来に渡って自分が長く使いそうな言語を、さっさと使い始めた方がいいのではないか?

今のところ、「今後、一生使っていける言語のナンバーワン」は、自分の中では、Lispが群を抜いて一位。

なので、perlを捨てて、Lispで仕事をしたいと、常々思う。

しかし……。


最終更新 : 2010/01/06 17:55:50 JST