Perl中文件的行号

Perl中文件的行号,perl,Perl,在awk中,如果我将多个文件作为awk的参数,则有两个特殊变量: NR=所有文件中所有行对应的行号 FNR=当前文件的行号 我知道在Perl中,$。对应于NR(所有文件行中的当前行) 在Perl中还有什么可以与AWK的FNR相媲美的吗 假设我有一些命令行: perl -pe 'print filename,<something special which hold the current file's line number>' *.txt Perl中没有这样的变量。但是你应该学

awk
中,如果我将多个文件作为
awk
的参数,则有两个特殊变量:

NR
=所有文件中所有行对应的行号

FNR
=当前文件的行号

我知道在Perl中,
$。
对应于
NR
(所有文件行中的当前行)

在Perl中还有什么可以与AWK的
FNR
相媲美的吗

假设我有一些命令行:

perl -pe 'print filename,<something special which hold the current file's line number>'  *.txt

Perl中没有这样的变量。但是你应该学习写一些像这样的东西

perl -ne 'print join ":", $. + $sum, $., "\n"; $sum += $., $.=0  if eof;' *txt
实际上,文档中展示了一种实现此目的的方法:

# reset line numbering on each input file
while (<>) {
    next if /^\s*#/;  # skip comments
    print "$.\t$_";
} continue {
    close ARGV if eof;  # Not eof()!
}

我发现这种情况是使用Perl的一个很大的缺点。虽然这个答案是次优的、性能方面的,并且只适用于涉及
xargs
的情况,但我通常发现它是我95%的时间使用的解决方法。因此,问题是:

£ git ls-files -z | xargs -0 perl -ne 'print "$ARGV:$.\t$_" if /#define oom/'
file.h:85806    #define oom() exit(-1)
这个行号显然是不正确的,您显然会得到与
find
相同的行为。当然,对于这个正则表达式或其他更简单的perl正则表达式,我只会使用
awk
git grep-p
。但是,如果您正在处理一个相当复杂的正则表达式,或者需要其他perl特性,那么这将不起作用……而这个问题的正确答案将使已经很可能是复杂的perl one liner变得更加复杂

因此,我只使用以下内容:

£ git ls-files -z | xargs -0 -n1 perl -ne 'print "$ARGV:$.\t$_" if /#define oom/'
file.h:43       #define oom() exit(-1)

-n1
xargs参数会导致xargs为每个文件启动一个perl进程,从而生成正确的行号。您看到的是非常显著的性能影响,但我发现它适用于具有数百万行代码的大型项目,而不是用perl解决它,我发现几乎总是需要一个实际的脚本,而不是一行代码。在绝大多数情况下,系统范围的搜索是不可接受的

打印“文件:”,文件,“行:”,行“\n”;您还应该查看Andy可能打算命名
\uuuuuuu文件\uuuuuuu
\uuuuuuu行\uuuuuuuuuuuu
,但忘记了代码格式。@choroba:OP问题的答案在您链接的文档中!最后一行不是缺少一个“{”和一个“}”吗?解释它是什么以及它是如何工作的。一行代码相当于:
perl-ne'print“$ARGV:$\ux”if$.==1.如果eof'*txt
,则关闭ARGV。由于主循环中没有
next
指令,因此不再需要
continue
块。
£ git ls-files -z | xargs -0 perl -ne 'print "$ARGV:$.\t$_" if /#define oom/'
file.h:85806    #define oom() exit(-1)
£ git ls-files -z | xargs -0 -n1 perl -ne 'print "$ARGV:$.\t$_" if /#define oom/'
file.h:43       #define oom() exit(-1)