分配<>在Perl中清空列表

时间:2015-07-27 01:06:28

标签: perl

如何理解钻石运算符(<>)在Perl中清空列表的方式,如下所示,是否因为没有涉及变量而进行任何赋值?

print (()=<>)

上面打印出的内容除了以下打印<>中的行数。行数如何传递到$x

print $x=()=<>

1 个答案:

答案 0 :(得分:10)

<>运算符的行为取决于上下文。在标量上下文中,它为您提供下一行读取,而在列表上下文中,它会读取直到EOF并为您提供它已读取的行的列表。

这样做:

()=<>

不会分配任何内容,但会强制执行列表上下文,以便&lt;&gt;提供所有读取行的列表。

这样做:

print $x=()=<>;

导致赋值运算符在标量上下文中被解释,因此产生行数(因为标量上下文中的列表赋值返回赋值右侧表达式生成的元素数)。

这也有效:

print (scalar (()=<>));

另一个有趣的方面是为什么:

print <>;

打印文件中的所有行,但是:

print (()=<>);

什么都不打印。原因是列表赋值表达式的结果是分配的值的列表。在后一种情况下,没有赋值,因此表达式的结果(然后由print使用)是一个空列表。

试试这个:

print ((undef,undef)=<>);

您会发现它为您提供了输入文件的前两行。即使这些行被分配给&#39; undef&#39;,它们仍然被分配,因此它们仍然是表达式结果的一部分。

有关=()=工作原理的更完整说明,您可以根据ThisSuitIsBlackNot的评论阅读perlsecret