来自perldoc,在perldata中,有一行代码如:
$count = () = $string =~ /\d+/g;
它表示将$ count设置为匹配数,因为分配到括号意味着分配给空列表并转换为列表上下文。但是当我这样做时:
print (() = $string =~ /\d+/g);
我原本打算打印一系列匹配但没有打印任何东西。如果空列表什么都没有,那么从()到$ count的先前赋值是如何工作的?第一个通过分配空列表意味着什么呢?它实际上做了什么?
更具体地说,
print $string =~ /\d+/g; #print all matches
print (() = $string =~ /\d+/g); #print nothing (why)
print ($count = () = $string =~ /\d+/g); #print number of matches (why again)
答案 0 :(得分:7)
关键区别(perldoc perldata):
标量上下文中的列表赋值返回元素数 由作业右侧的表达式:
生成$x = (($foo,$bar) = (3,2,1)); # set $x to 3, not 2
使用$count = () = $string =~ /\d+/g;
,您可以在列表分配上设置标量上下文,因此匹配的数量 - $string =~ /\d+/g
生成的元素 - 将存储在$count
变量中。
但是print(() = $string =~ /\d+/g);
与my ($a, $b);
my $x = ($a, $b) = (1,2,3,4);
say $x; # 4
my @x = ($a, $b) = (1,2,3,4);
say join '-', @x; # 1-2
不一样:
因为print采用LIST,所以LIST中的任何内容都在列表中进行评估 上下文
在列表上下文中,列表分配结果是赋值的左侧 - 正如您可能猜到的那样,在这种情况下是一个空列表。打印,它只是给你一个空字符串。
我希望这个例子有助于显示上下文在这里产生的差异。
{{1}}
答案 1 :(得分:2)
在
$count = () = $string =~ /\d+/g;
()
会将$string =~ /\d+/g
放入列表上下文中,因此会返回匹配数字的列表,因此上述语句等于
$count = (() = (num1, num2, ...))
第二个赋值是一个列表赋值,$count =
将它放在标量上下文中,标量上下文中的列表赋值将返回=
右侧有多少个元素。
print
的参数是一个列表,其每个元素都将在列表上下文中进行评估。因此在
print (() = $string =~ /\d+/g);
它等于您首先将$string =~ /\d+/g
分配给()
,并使用该结果列表(它是一个空列表)作为print
的参数,这意味着print
声明等于
print ();
这很容易解决:
print scalar(() = $str =~ m/\d+/g), "\n";
scalar
将其参数置于标量上下文中。
另一个例子,在
中(() = @list, "\n")
此列表的第一个元素() = @list
将在列表上下文中进行评估,并将生成一个空列表。所以上面的列表等于
((), "\n")
因为子列表将在列表中自动插入,所以上面列表的最终结果只是
("\n")