在"Programming Perl"一书中有一个片段(cutted):
默认情况下,当(EXPR)被视为隐式智能匹配时
$_;,$_ ~~ EXPR.但是,如果when的EXPR参数是下面列出的10种异常形式之一,则直接计算布尔结果,并且不会发生智能匹配:
...
正则表达式匹配形式为/ REGEX /,$ foo =〜/ REGEX /或$ foo = ~EXPR.
这是什么意思evaluated directly for a Boolean result?
例:
#!/usr/bin/perl
use v5.14;
my @a = ('aaa', 'bbb', 'ccc');
given(@a) {
when (/a/) { say '@a contains an a'; }
default { say '@a does not contain an a' }
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,输出会不时变化:
@a does not contain an a
@a contains an a
@a does not contain an a
@a does not contain an a
Run Code Online (Sandbox Code Playgroud)
我无法理解这里发生了什么,有人可以这么愉快地帮忙吗?
提前欣赏.
cho*_*oba 11
仔细阅读文档:
另一个有用的快捷方式是,如果使用文字数组或散列作为"给定"的参数,则将其转换为引用.因此,"给定(@foo)"与"给定(\ @ foo)"相同,例如.
因此,given (@a)变成了given(\@a).没有智能匹配,因为你使用when (/a/),所以你试图匹配
\@a =~ /a/
Run Code Online (Sandbox Code Playgroud)
引用是字符串化的.它有时包含"a" ARRAY(0x9a4e7f8),但通常不包含:-)
documentatiom意味着when (/a/)不等同于if ($_ ~~ /a/),它将检查是否有任何数组元素与正则表达式匹配,但是if ($_ =~ /a/)只检查标量是否$_匹配.
传递数组时given,会为该数组分配引用.并且因为(如文档所述)智能匹配运算符未被使用,所以类似的条件when (/a/)相当于\@a =~ /a/.
因为在尝试正则表达式匹配之前将引用字符串,所以它将比较类似的内容ARRAY(0x61c6dc).由于您a在字符串中查找小写,如果字符串中的十六进制数组位置恰好包含一个,则为true a.根本不是你想要的!