曲径通幽论坛

标题: 智能匹配操作符(~~) 及其优先级 [打印本页]

作者: beyes    时间: 2011-10-14 01:06
标题: 智能匹配操作符(~~) 及其优先级
智能匹配操作符 ~~
绑定操作符 =~
能力更强些,甚至可以替代绑定操作符。比如:
[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' 这种比较是相等的。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2