为什么STDIN在列表上下文中工作?

时间:2013-04-11 13:33:32

标签: perl list stdin reverse

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

print reverse <STDIN>;

为什么我会获得列表上下文?我的意思是reverse根据doc是列表或标量上下文。 print也是如此。

  

打印字符串 字符串列表。如果,则返回true   成功的。

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

3 个答案:

答案 0 :(得分:7)

你似乎把两件独立的东西混为一谈:

  • 在列表,标量或无效上下文中评估运算符。
  • 操作员决定评估其操作数的上下文。

reverse的操作数始终在列表上下文中进行评估。

reverse LIST

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


与所有可以返回标量之外的其他运算符一样,reverse在标量上下文和列表上下文中的行为方式不同。

print的操作数始终在列表上下文中进行评估。

print LIST

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

答案 1 :(得分:3)

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

因此,在这种情况下,reverse知道它在列表上下文中被调用,从而反转其列表参数。

答案 2 :(得分:2)

print reverse <STDIN>;基本上与:

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

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

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