itochin2の日記(仮)

主に備忘録。Perl、MySQL、Unity、開発管理などについて情報を残していきたい。

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になること。

これは非常に危険だ。怖い。
こんなバグに気付けない・・・。

便利だけど、使わないようにしよう。