smart match ~~
用法
$key ~~ %hash # Does $key exist in %hash ?
$value ~~ @array # Does $value exist in @array?
以下一个失败一个成功
my @primary = ("red", "blue", "green");
if (@primary ~~ "red") { # false
print "primary smartmatches red";
}
if ("red" ~~ @primary ) { #true
print "red smartmatches primary";
}
以下是失败的例子,不能这样用
my@array1=qw/1 2 3 /;
my@array2=qw/1 2 3 4/;
print "yes" if @array ~~ @array2;
#测试中,发现 ~~ 后面需要变量,以下这个失败
if 2 ~~ qw(1 2 3) #false
#但这个是成功的,奇怪需要更多测试
# Print only lines 13, 19 and 67
perl -ne 'print if int($.) ~~ (13, 19, 67)'
# Print all lines from line 17 to line 30
perl -ne 'print if int($.) ~~ (17..30)'
perl中对于两个数组的对比方法,一般能google到的都是利用e xists的方法进行的。 exists是寻找该key是否在hash中存在。所以,keys必须是uniq的。这个不太方便。 复习了一下linux的命令,发现diff和comm其实还是比较能帮忙的,真的要做对比分析,还是需要用到这些。
注意的是,diff是要对比所有字符,包括不可见字符。记得需要的时候要加 -Wb -w, –ignore-all-space -B, –ignore-blank-lines
comm是分3列来显示的,-1-2-3分别是surpress(不显示)相应列数,这个单词误我好久!
my@a=qw/1 2 3 /;
my@b=qw/1 2 3 4 5/;
my%h;
@h{@a}=() ;
print "yes" if @a ~~ %h ;
print grep {!exists $h{$_} } @b ;