4

根据上下文,我们得到一个标量或一个数组。到目前为止还好。
但在下面:

print reverse <STDIN>;

为什么我会得到一个列表上下文?我的意思是根据文档的反向是列表或标量上下文。打印也是如此。

打印一个字符串 或字符串 列表。如果成功则返回真。

也是如此STDIN。那么为什么在STDIN这里检索直到 EOF 之前的行而不是只收集第一行呢?

4

3 回答 3

7

您似乎将两个独立的事物混为一谈:

  • 运算符在列表、标量或 void 上下文中进行评估。
  • 运算符决定在哪个上下文中评估其操作数。

的操作数reverse总是在列表上下文中计算。

reverse LIST

因此<STDIN>将在列表上下文中进行评估。


像所有可以返回标量以外的东西的运算符一样,reverse在标量上下文和列表上下文中的行为不同。

的操作数print总是在列表上下文中计算。

print LIST

因此reverse将在列表上下文中进行评估。这意味着它将反转其操作数的顺序。它不会颠倒每个操作数的字符顺序,也不会连接列表。

于 2013-04-11T14:08:25.503 回答
3

实际上print总是打印一个字符串列表。你可以给它传递一个标量,但它的行为就好像它是一个列表一样。

所以在这种情况下reverse知道它是在列表上下文中调用的,因此会反转它的列表参数。

于 2013-04-11T13:37:38.270 回答
2

print reverse <STDIN>;本质上是一样的:

@lines = <STDIN>;
@reversed_lines = reverse @lines;
print @reversed_lines;

Saying$line = <STDIN>;会从 STDIN 读取一行,而从 STDIN@line = <STDIN>;读取一个列表

的参数列表print始终是列表上下文。行上下文可以通过使用连接运算符来强制执行:print reverse <STDIN> . "";将读取一行而不是列表。

于 2013-04-11T13:51:18.880 回答