bool の overload
フロー制御と三項演算子の時だけ使われるんですか?と恐怖したのでテストしてみました。Boolean, string and numeric conversion
'bool', '""', '0+',If one or two of these operations are not overloaded, the remaining ones can be used instead. bool is used in the flow control operators (like while) and for the ternary ?: operation. These functions can return any arbitrary Perl value. If the corresponding operation for this value is overloaded too, that operation will be called again with this value.
(略)
#!/usr/bin/perl my $a = new True; warn "true\n" if $a; # line 5 warn "true\n" if 0 && $a; my $b = 1 && $a; warn "$b\n"; # line 9 warn "true\n" if $b; # line 11 my $c = 1 && $a && 0; # line 13 warn "$c\n"; warn "true\n" if $c; exit; package True; use overload ( bool => \&_opo_bool, '""' => \&_opo_str, ); sub new { my ($class) = @_; return bless {}, $class; } sub _opo_bool { my ($self) = @_; my ($pkg, $fname, $line) = caller(); print {*STDERR} "bool-op called from $fname line $line.\n"; return 1; } sub _opo_str { my ($self) = @_; my ($pkg, $fname, $line) = caller(); print {*STDERR} "str-op called from $fname line $line.\n"; return 'True'; }文字列化演算子もオーバーロードしたのは,上記引用で太字にした部分の前のとこに書いてあるように,それがないと文字列化時にbool演算子が代用される可能性があるからです(実際,それをはずしてやってみるとわかります)。 実行結果は,bool-op called from test.pl line 5. true str-op called from test.pl line 9. True bool-op called from test.pl line 11. true bool-op called from test.pl line 13. 0のようになりました。リストと照らし合わせるとわかりますが,基本的に「論理演算の必要が出てきた時に実行される」みたいですね。 Perl の暗黒面を覗いてしまった気がします。