一、智能匹配操作符
1、Perl 5.10及以上版本中的智能匹配操作符(~~)会根据需要选择恰当的方式比较两端的操作数。它只用于判断操作数是否相同,在比较大小时就不能用了,老老实实的用传统的比较操作符吧。智能匹配操作符~~和前面讲的绑定操作符=~很像,不过相对来说~~操作符更强悍一些,他甚至可以代替绑定操作符。如下:
#!/usr/bin/perl
my $flag = 0;
foreach my $key (keys %names){
next unless $key =~ /Fred/;
$flag = $key;
last;
}
print("I found a key matching 'Fred'. It was %flag\n") if($flag);
#!/usr/bin/perl
use 5.010001;
say("I found a key matching 'Fred'") if(%names ~~ /Fred/);
这里智能匹配操作符发现了左侧是一个哈希,右侧是一个正则表达式,因此它聪明地遍历%names的所有键,用给定的正则表达式逐个测试,如果找到就立即停止,并返回真。在这里的匹配和标量的匹配不太一样,它集数种不同的操作于一身,用了一个操作符就解决了各种各样的问题。
2、两个数组的比较(只考虑长度相同的数组)如果按照常规的方法可以按数组索引依次遍历,取出相同位置的两个元素比较。如果比较下来两者相抵,则令计数器$equal自增1,循环结束后如果$equal和数组@names1的长度一致则说明两个数组完全相同:
#!/usr/bin/perl
my $equal = 0;
foreach my $index ( 0 .. $#names1 ) {
last unless($names1[$index] eq $names2[$index]);
$equal++;
}
print("The arrays have the same elements!\n)" if($equal == @names1);
#!/usr/bin/perl
use 5.010;
say("The arrays have the same elements!") if(@names1 ~~ @names2);
二、智能匹配操作处的理方式
下表是智能匹配操作符对不同操作数的处理方式:
例子 | 匹配方式 |
%a ~~ %b | 哈希的键是否一致 |
%a ~~ @b | 至少 %a 中的一个键在列表@b中 |
%a ~~ /Fred/ | 至少一个键匹配给定的模式 |
%a ~~ 'Fred' | 哈希中某一指定键$a{Fred}是否存在 $a{Fred} |
@a ~~ @b | 数组是否相同 |
@a ~~ /Fred/ | 有一个元素匹配给定的模式 |
@a ~~ 123 | 至少有一个元素转化为数字后是123 |
@a ~~ 'Fred' | 至少有一个元素转化为字符串后是'Fred' |
$name ~~ undef | $name确实尚未定义 |
$name ~~ /Fred/ | 模式匹配 |
123 ~~ '123.0' | 数字和字符串是否相等 |
'Fred' ~~ 'Fred' | 字符串是否相同 |
123 ~~ 456 | 数字是否相等 |