如何理解钻石运算符(<>
)在Perl中清空列表的方式,如下所示,是否因为没有涉及变量而进行任何赋值?
print (()=<>)
上面打印出的内容除了以下打印<>
中的行数。行数如何传递到$x
?
print $x=()=<>
答案 0 :(得分:10)
<>
运算符的行为取决于上下文。在标量上下文中,它为您提供下一行读取,而在列表上下文中,它会读取直到EOF并为您提供它已读取的行的列表。
这样做:
()=<>
不会分配任何内容,但会强制执行列表上下文,以便&lt;&gt;提供所有读取行的列表。
这样做:
print $x=()=<>;
导致赋值运算符在标量上下文中被解释,因此产生行数(因为标量上下文中的列表赋值返回赋值右侧表达式生成的元素数)。
这也有效:
print (scalar (()=<>));
另一个有趣的方面是为什么:
print <>;
打印文件中的所有行,但是:
print (()=<>);
什么都不打印。原因是列表赋值表达式的结果是分配的值的列表。在后一种情况下,没有赋值,因此表达式的结果(然后由print使用)是一个空列表。
试试这个:
print ((undef,undef)=<>);
您会发现它为您提供了输入文件的前两行。即使这些行被分配给&#39; undef&#39;,它们仍然被分配,因此它们仍然是表达式结果的一部分。
有关=()=
工作原理的更完整说明,您可以根据ThisSuitIsBlackNot的评论阅读perlsecret。