use 5.010001; #至少是5.10.1版
会根据两边的操作数的数据类型自动判断该用何种方式进行比较或匹配。
use 5.010001;
say "I found a key matching 'Fred'" if %names ~~ /Fred/;
对于哈希和正则表达式,智能匹配遍历哈希所有键,用给定的正则表达式逐个测试,找到匹配的键,就返回真。
say "The arrays have the same elements!" if @names1 ~~ @names2;
say "yes" if $value ~~ @nums;
智能匹配对两边的操作数的顺序一般没有要求[ if @nums ~~ $value ]。
%a ~~ %b 哈希的键是否一致
%a ~~ @b 哈希至少一个键在列表中
%a ~~ /Fred/ 至少一个键匹配给定模式
'Fred' ~~ %a 是否存在$a{Fred}
@a ~~ @b 数组是否相同
@a ~~ /Fred/ 数组中至少一个元素匹配模式
$name ~~ undef $name $name没有定义
$name ~~ /Fred/ 模式匹配
123 ~~ '123.0' 数值和“numish”类型的字符串是否相等
'Fred' ~~ 'Fred' 字符串是否相同
123 ~~ 456 数值是否相等
say "match number ~~ string" if 4 ~~ '4abc';
say "match string ~~ number" if '4abc' ~~ 4;
输出:match string ~~ number。
given-when控制结构类似C语音的switch。
use 5.010001;
given ( $ARGV[0] ) {
when ( 'Fred' ) { say 'Name is Fred' }
when ( /fred/i ) {say 'Name has fred in it'}
when ( /\AFred/ ) {say 'Name starts with Fred'}
default {say "I don't see a Fred"}
}
given会将参数化名为$_,每个when都尝试智能匹配$_。
可以在when语句块末尾使用continue,Perl会尝试执行下一条的when语句,在条件满足时执行对于语句块。
given-when语句中也可以使用普通的比较或匹配,也可以和智能匹配混用。
否定的表达式,包括否定的正则表达式,都不会使用智能匹配。
when可以和foreach配合使用
foreach ( @names ) { #不要使用具名控制变量
say "\nProcessing $_";
when ( /fred/i ) {say 'Name has fred in it'; continue}
when ( /\AFred/ ) {say 'Name starts with Fred'; continue}
when ( 'Fred' ) { say 'Name is Fred'; }
say "Moving on to default...";
default {say "I don't see a Fred"}
}