根据上下文,我们得到一个标量或一个数组。到目前为止还好。
但在下面:
print reverse <STDIN>;
为什么我会得到一个列表上下文?我的意思是根据文档的反向是列表或标量上下文。打印也是如此。
打印一个字符串 或字符串 列表。如果成功则返回真。
也是如此STDIN
。那么为什么在STDIN
这里检索直到 EOF 之前的行而不是只收集第一行呢?
您似乎将两个独立的事物混为一谈:
的操作数reverse
总是在列表上下文中计算。
reverse LIST
因此<STDIN>
将在列表上下文中进行评估。
像所有可以返回标量以外的东西的运算符一样,reverse
在标量上下文和列表上下文中的行为不同。
的操作数print
总是在列表上下文中计算。
print LIST
因此reverse
将在列表上下文中进行评估。这意味着它将反转其操作数的顺序。它不会颠倒每个操作数的字符顺序,也不会连接列表。
实际上print
总是打印一个字符串列表。你可以给它传递一个标量,但它的行为就好像它是一个列表一样。
所以在这种情况下reverse
知道它是在列表上下文中调用的,因此会反转它的列表参数。
print reverse <STDIN>;
本质上是一样的:
@lines = <STDIN>;
@reversed_lines = reverse @lines;
print @reversed_lines;
Saying$line = <STDIN>;
会从 STDIN 读取一行,而从 STDIN@line = <STDIN>;
读取一个列表。
的参数列表print
始终是列表上下文。行上下文可以通过使用连接运算符来强制执行:print reverse <STDIN> . "";
将读取一行而不是列表。