根据上下文,我们得到标量或数组。好的,到目前为止 但是在下面:
print reverse <STDIN>;
为什么我会获得列表上下文?我的意思是reverse根据doc是列表或标量上下文。 print也是如此。
打印字符串 或 字符串列表。如果,则返回true 成功的。
STDIN
也是如此。那么为什么STDIN
这里检索行直到EOF而不只是收集第一行?
答案 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> . "";
将读取行而不是列表。