"Perl编程"中的"直接评估布尔结果,没有智能匹配"是什么意思?

use*_*860 3 perl boolean

在"Programming Perl"一书中有一个片段(cutted):

默认情况下,当(EXPR)被视为隐式智能匹配时$_;,$_ ~~ EXPR.但是,如果when的EXPR参数是下面列出的10种异常形式之一,则直接计算布尔结果,并且不会发生智能匹配:

  1. ...

  2. 正则表达式匹配形式为/ 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),但通常不包含:-)


Bor*_*din 5

documentatiom意味着when (/a/)不等同于if ($_ ~~ /a/),它将检查是否有任何数组元素与正则表达式匹配,但是if ($_ =~ /a/)只检查标量是否$_匹配.

传递数组时given,会为该数组分配引用.并且因为(如文档所述)智能匹配运算符未被使用,所以类似的条件when (/a/)相当于\@a =~ /a/.

因为在尝试正则表达式匹配之前将引用字符串,所以它将比较类似的内容ARRAY(0x61c6dc).由于您a在字符串中查找小写,如果字符串中的十六进制数组位置恰好包含一个,则为true a.根本不是你想要的!