曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4299|回复: 0
打印 上一主题 下一主题

智能匹配操作符(~~) 及其优先级

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-10-14 01:06:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
智能匹配操作符 ~~
绑定操作符 =~
能力更强些,甚至可以替代绑定操作符。比如:
[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' 这种比较是相等的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 04:29 , Processed in 0.065113 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表