昨日ちょっとor dieの話を取り上げたけど、あれは結構変な仕掛けらしい。
open IF,'普段は3変数openを使うけど省スペースのため2変数openだよ。
さて、どんな具合か、それっぽいフローチャートで書いてみよう。
左が実際の動作。RESは返り値が入る仮変数。どうでもいいけど。
1と何のorを取っても1になるという性質を使ってるわけだ。
返り値として1を受け取った時点で、1という結論を出してしまう。
だからopenの時点で1となれば、dieの結果が0だろうが、最終的な答えは1だからdieは実行しなくていいと。
こういう性質を持つ、|| , && , or , and の演算子を短絡論理演算子とかいうらしい。
どの辺が短絡なのかというと、dieの結果を確認せずに結論を出すあたり。
非常に変な話です。or dieを使ってる人は右のフローチャートのようにしか考えていない。
しかしながらこれは、unless(open IF,'die unless(open IF,' unlessはifの逆。偽ならば実行。だからif(!open IF,'
まぁどれにしてもちょっともっさりしてるからor dieは便利ですね。
Perlとか、PHPでも使うみたいだけど、Cで使ってるのは見たことがない。だが、Cでも使えるみたい。
orでできるのならandでもできますよ。
@arr and print @arr;なんか気持ち悪いけどね。けど理屈は一緒だ。
if(@arr)というのは、@resに要素があるかないかだ。というわけでさっきのは普通は、print @arr if(@arr);と書きますね。まぁこれをandで書けばスマートに書けるかもと言ったが気持ち悪いだけだ。
以上のことからこういう公式が出来ますね。func1() or func2(); ⇔ func2() unless(func1()); ⇔ unless(func1()){func2();}
func1() and func2(); ⇔ func2() if(func1()); ⇔ if(func1()){func2();}どうでもいいけど、unlessって本当に使わないよねー。まぁ!で否定すりゃいいだけだからね。
余談だが、僕はこんなスクリプトをよく書く。my @matches=($data =~ m/^([0-9]+)\s+(.+)$/mg );
my @person=();
while(@matches){
push(@person, {id=>shift(@matches) , name=>shift(@matches) } );
}複数マッチとグループ化を組み合わせると、('001','Taro Yamada','002','Ken Kimura')のようなリストができるから、
これを前からshiftで2個引き抜いて、ハッシュのリファレンスを新しいリストにpushして、というのを@matchesが全部なくなるまでやると。
これはなかなか便利ですよ。
orとand、うーん…どんなとき使えるかなぁ…
open IF,'<','test.txt';
my @data=();
while(){
m/^([0-9]+)\s+(.+)$/ or next;
push(@data,{id=>$1,name=>$2});
}orはこんな風な使い道がありますかな。
orは、ファイルを開くか強制終了か、マッチするか一周終わりか、みたいに意味もつかみやすいですね。
実際の意味はそんなことではないのだけどね。さっき言った通りです。
もっとも今回の例では、1文だけだから、push(@data,{id=>$1,name=>$2}) if(m/^([0-9]+)\s+(.+)$/);この方が好きだけどね。
けど、もしこの後にひたすら処理が続くならnextで飛ばすのは得策だから、or nextは便利かもしれない。
しかし、こういうのもあるかもしれない。while(1){
my $line=<>;
$line =~ m/^\s*$/ and last;
}空白文字(改行含む)だけを打ち込まれたときはlastで抜け出すと。
非常にイメージの沸きにくい書き方だ。しかもこんなのは、last if($line =~ m/^\s*$/);この方がわかりやすいですよね。
ifは非常に身近ですからね。だからついつい使いたくなる。
しかし慣れればこれもいいと思えるときが来るのだろうか。
Perlのモットーといえばいいのだろうか、
"There's More Than One Way To Do It"
意味は、やり方はいくらでもある。
or nextにせよand lastにせよ、Cなどではまず使うことのないやり方だけど、Perlでは普通に使う。
or dieは便利だからね。うん。
数あまたの省略表記も便利な場合とわかりにくい場合があるけど、その辺は自分で考えろと。
そういうことなんだと思います。こういう風にor,andを使うのはor dieだけというのもいいと思いますよ。

