ルモーリン
ホーム更新サービス雑談ランドナーコースガイド鉄ゲタ自転車Linuxリンク連絡先

論理演算子の「or」と「||」の違い

背景

論理演算子の「and」と「&&」の違いの記事を書いたので、ついでにorと||も書いてみよう。

コード

皆さんお馴染みの「or die」の代わりに「|| die」にして動かすと塩梅が悪い。 下のコードで対象のファイルがないときにdieメッセージのはずがその先へ行ってしまいエラーで停止する。
#!/usr/bin/env perl -w

use utf8;
use warnings;
use strict;

use Encode::Locale;
use open IO => ":utf8";

binmode STDOUT, ":encoding(console_out)";
binmode STDERR, ":encoding(console_out)";

$| = 1;

my $sample = "sample_18.txt";

open my $fh, "<", $sample || die "ファイル($sample)がありません。";
while (<$fh>) {
	chomp;
	print "'$_'\n";
}
close $fh;

exit;

解説

openのファイル名は$sampleだけかdieを含むかの違いですね。 orなら「$sample」で、||なら「$sample || die "~"」です。 ||で$sampleにファイル名が入っていれば真になり評価は左側で打ち切りファイル名がopenに伝わります。 例えばファイルがなく「openが失敗した場合にdie」のつもりがdieはファイル名と共に評価済(打ち切りだけど)なのでdieしないでwhileに行ってしまう。 上記のコードで件のファイル(sample_18.txt)がない場合はこうなります。
readline() on closed filehandle $fh at sample_18.pl line 18.