了解分配给空数组

时间:2014-04-26 07:20:47

标签: perl

来自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)

2 个答案:

答案 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")