【问题标题】:How does `print readline` differ from `$line = readline; print $line`?`print readline` 与 `$line = readline; 有何不同?打印 $line`?
【发布时间】:2021-10-22 15:52:42
【问题描述】:

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

这按预期工作:

$ 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

相反,它会打印所有行。为什么?

【问题讨论】:

    标签: perl text text-processing


    【解决方案1】:

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

    阅读更多关于上下文here

    【讨论】:

      【解决方案2】:

      readline 被调用的上下文不同。

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

      另一方面,

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

      等效:[1]

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2020-05-23
      • 2022-12-02
      • 2021-09-30
      • 2019-03-26
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      相关资源
      最近更新 更多