perlのスマートマッチ演算子が怖い
perl 5.10から実装されたスマートマッチ演算子を勉強した時のメモ。
~~:スマートマッチ演算子(smart match operator)とは
渡された2つのオペランドをもとに、どのように比較するかを自分で判断する。
もしオペランドが数値なら数値として比較。文字列なら文字列として比較。
正規表現だったらパターンマッチを実行。
それと、ハッシュと正規表現を比較した時には、
各キーにたいして正規表現マッチを行なって、キーが見つかれば真を返す。
ちなみに、配列と数値を比較した場合は、要素があるかのチェックになる。
サンプルコード
以下は、hashの中に'aaa'というキーワードが存在するかをチェックするプログラム。
存在したらflagを1にする。
#!/usr/bin/perl use 5.01; use warnings; use strict; my %hash = ( 'aaa' => 1, 'bbb' => 2, 'ccc' => 3, ); my $flag = 0; foreach my $key (keys %hash) { if ($key =~ /aaa/) { $flag = 1; last; } } print "flag is $flag\n"; # flag is 1 $flag = ('aaa' ~~ %hash) ? 1 : 0; print "flag is $flag\n"; # flag is 1 $flag = (%hash ~~ 'aaa') ? 1 : 0; print "flag is $flag\n"; # flag is 0 !?
恐ろしいのは'aaa'を左側に置くとflagが1になるのに
右側に置くとflagが0になること。
これは非常に危険だ。怖い。
こんなバグに気付けない・・・。
便利だけど、使わないようにしよう。