`print readline` 与 `$line = readline; 有何不同?打印 $line`?

How does `print readline` differ from `$line = readline; print $line`?

我编写了一个脚本,在匹配后打印当前行和后续行,但是,我注意到使用 readline return 值的两种方式之间存在差异。

这按预期工作:

$ echo $'H1\na\nb\nH2\na\nb' | perl -ne 'if (/^H/) { print; print $line = readline }'
H1
a
H2
a

然而,这不是:

$ echo $'H1\na\nb\nH2\na\nb' | perl -ne 'if (/^H/) { print; print readline }'
H1
a
b
H2
a
b

而是打印所有行。为什么?

print 采用列表参数,并将 readline() 放入列表上下文中。因此它用尽了所有的行。当您将标量赋值与 $line = 一起使用时,它处于标量上下文中,并且只会读取 1 行。

详细了解上下文 here

调用readline的上下文不同。

$line = readline中,=是标量赋值运算符,它在标量上下文中计算其操作数。在标量上下文中,readline returns 一行。

另一方面,

print 接受它在列表上下文中求值的表达式。在列表上下文中,readline returns 所有剩余行。

等价于:[1]

  • $line = readline; print $line;
  • print $line = readline;
  • print scalar(readline);

  1. 如果$line不神奇。除了对 $line.
  2. 的影响