`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);
- 如果
$line
不神奇。除了对 $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);
- 如果
$line
不神奇。除了对$line
. 的影响