【问题标题】:Is __LINE__ constant-folded in this Perl one-liner?__LINE__ 在这个 Perl 单行代码中是恒定折叠的吗?
【发布时间】:2018-08-21 01:50:42
【问题描述】:

在探索 sarathi 的 current file line number question 的替代答案时,我写了这个单行字,期望它会打印提供的所有文件的第一行:

$ perl -ne 'print "$ARGV : $_" if __LINE__ == 1;' *txt

这没有按预期工作;所有行都打印出来了。

通过-MO=Deparse 运行单行显示条件不存在。我认为这是因为它在编译时已被常量折叠:

$  perl -MO=Deparse -ne 'print "$ARGV : $_" if __LINE__ == 1;' *txt
LINE: while (defined($_ = <ARGV>)) {
    print "$ARGV : $_";
}
-e syntax OK

但是为什么呢?

在 Perl 5.8.8 下运行。

【问题讨论】:

  • 检查我的编辑以打印所有文件的第一行。

标签: perl constantfolding


【解决方案1】:

__LINE__ 对应 Perl 源代码中的行号,而不是输入文件中的行号。

【讨论】:

  • 我很享受我的“啊哈!”这里的时刻。应该更仔细地阅读perldata...
【解决方案2】:

__LINE__ 是源代码行号,即程序行号。 $. 会给你输入文件的行号。

如果你想打印所有文件的所有第一行,那么你可以试试这个:

perl -lne '$.=0 if eof;print $_ if ($.==1)' *.txt

【讨论】:

  • 是的!让我感到困惑的是当前文件名的使用和问题的上下文
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2016-08-17
  • 2016-10-26
相关资源
最近更新 更多