智能匹配操作符 ~~ 比 能力更强些,甚至可以替代绑定操作符。比如:
[Perl] 纯文本查看 复制代码 $name = "perl";
print "hello perl world!\n" if $name =~ /perl/;
$name = "PERL";
say "hello PERL world!\n" if $name ~~ /PERL/;
运行输出:$ ./intelch.pl
hello perl world!
hello PERL world!
一般情况下,比较两个数组中的元素是否完全相等,可能会想到遍历每个数组然后逐个比较其元素,但是使用智能匹配操作符,那么事情就会变得简单多了:
[Perl] 纯文本查看 复制代码 my @arr1 = qw(www groad net);
my @arr2 = qw(www groad net);
say "The arrays have the same elements!" if @arr1 ~~ @arr2;
运行输出:The arrays have the same elements!
可以检查某个元素是否在数组中:
[Perl] 纯文本查看 复制代码 say "The word \"groad\" is in the (@arr1)" if "groad" ~~ @arr1;
运行输出:The word "groad" is in the (www groad net) 注意,这里 if 后的 "groad" 和 @arr1 的位置不能调换,否则比较失败。
智能匹配操作符对不同操作数的处理方式:%a ~~ %b : 哈希的键是否一致
%a ~~ @b : 至少 %a 中的一个键在列表 @b 之中
%a ~~ /Tony/ : 至少一个键匹配给定的模式
%a ~~ 'Tony' : 哈希中某一指定键 $a{Tony} 是否存在
@a ~~ @b : 数组是否相同
@a ~~ /Tony/ : 有一个元素匹配给定的模式
@a ~~ 123 : 至少有一个元素转化为数字后是 123
@a ~~ 'Tony' : 至少有一个元素转化为字符串后时 'Tony'
$name ~~ undef : $name 确实尚未定义
$name ~~ /Tony/ : 模式匹配
123 ~~ ‘123.0’ : 数字和字符串是否大小相等
123 ~~ 456 : 是否大小相等 当使用智能匹配操作符时,Perl 会按照上面的图标自上而下查看适用的操作数对,先找到哪一种搭配就选择对应的操作。
有一种字符串叫做 numish 字符串,它们是一串数字,如 '123', '3.14159' 等等,虽是数字形式,但仍然是字符串。Perl 看到它们时会悄悄的把这种字符串转换为数字,并不发出任何警告。Perl 看到一个数字和一个 numish 字符串在智能匹配操作符的两侧时,它就会按照数字来比较大小。否则,就按照字符串来比较大小。所以,123 ~~ '123.0' 这种比较是相等的。 |