我想从我的.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
| 归档时间: |
|
| 查看次数: |
384 次 |
| 最近记录: |