Perl:从1到n提取行(Windows)

atr*_*lla 3 csv perl

我想从我的.csv文件中提取行1到n.用这个

perl -ne 'if ($. == 3) {print;exit}' infile.txt 
Run Code Online (Sandbox Code Playgroud)

我只能提取一行.如何将一系列行放入此脚本?

tch*_*ist 11

如果您只有一个范围和一个可能连接的输入流,则可以使用:

#!/usr/bin/perl -n
if (my $seqno = 1 .. 3) {
    print;
    exit if $seqno =~ /E/;
}
Run Code Online (Sandbox Code Playgroud)

但是如果你想将它应用于每个输入文件,你需要捕获每个文件的结尾:

#!/usr/bin/perl -n
print if my $seqno = 1 .. 3;
close ARGV if eof || $seqno =~ /E/;
Run Code Online (Sandbox Code Playgroud)

如果你想对忘记args的人友好,可以在一个BEGIN或者INIT子句中添加一个很好的警告:

#!/usr/bin/perl -n
BEGIN { warn "$0: reading from stdin\n" if @ARGV == 0 && -t }
print if my $seqno = 1 .. 3;
close ARGV if eof || $seqno =~ /E/;
Run Code Online (Sandbox Code Playgroud)

值得注意的要点包括:

  • 您可以使用-n-p#!线.您也可以在其中放置一些(但不是全部)其他命令行开关,例如?l?a.

  • 作为标量触发器操作符的操作数的数字文字每个都与readline计数器进行比较 ,因此标量1 .. 3实际上是($. == 1) .. ($. == 3).

  • eof既不是参数也不是空的parens调用意味着在魔术ARGV文件列表中读取的最后一个文件.这与整个迭代eof()的结束形成鲜明对比. <ARGV>

  • 返回触发器操作符的最终序列号,并"E0"附加一个序列号.

  • -t运营商,它调用的libc的isatty(3),默认为STDIN手柄-不同于任何其他filetest运营商.

  • BEGIN{}编译期间会发生一个块,因此如果您尝试反编译此脚本?MO=Deparse以查看其真正的功能,那么该检查将会执行.有了INIT{},它不会.

  • 这样做会发现隐式输入循环作为一个标签LINE,你可能在其他情况下可能会利用它.

HTH