第十五章 智能匹配与given-when结构 (use 5.010;新特性)
1. 智能匹配操作符(~~)能够根据操作数自动判断并进行操作。
2. 智能匹配操作符的优先级
%a ~~ %b 哈希的键是否一致
%a ~~ @b 至少%a中的一个键在列表@b之中
%a ~~ /Fred/ 至少一个键匹配给定的模式
%a ~~ 'Fred' 哈希中某一指定键$a{Fred}是否存在
@a ~~ @b 数组是否相同
@a ~~ /Fred/ 至少有一个元素匹配给定的模式
@a ~~ 123 至少有一个元素转化为数字后是123
@a ~~ 'Fred' 至少有一个元素转化为字符串后是'Fred'
$name ~~ undef $name确实尚未定义
$name ~~ /Fred/ 模式匹配
123 ~~ '123.0' 数字和(看起来numish的)字符串是否大小相等
/Fred/ ~~ /Fred/ 字符串是否完全相同
123 ~~ 456 是否大小相等
当使用只能匹配操作符时,Perl会按此表自上而下查看使用的操作数,先找到哪一种匹配就选择对应的操作.
当两个标量以字符串的形式存储像'123','3.14149'这些数字的时候,使用智能匹配操作符进行比对时会默认将这些字符串转换为数字,然后在进行比对.
say "I found Fred in the name!\n" if $name ~~ /Fred/;
say "I found a key matching 'Fred'" if %names ~~ /Fred/;
say "The arrays have the same elements\n" if @names1 ~~ @names2;
3. given-when结构
类似于C语音的switch-case,但是功能比其强。
use 5.010;
given( $ARGV[0] ) { #given语句包含在foreach中时,可以省略
when( $_ ~~ /fred/i ) { say 'Name has fred in it'; } #可以没有continue或break
say "Processing"; #还可以使用when以外的语句
when( $_ ~~ /^Fred/ ) { say 'Name starts with Fred'; continue } #continue 结束当前when,进行下一个when
when( $_ ~~ 'Fred' ) { say 'Name is Fred'; break } # break 跳出given-when结构
default { say "I don't see a Fred" }
}