我想从 .csv 文件中提取第 1 行到第 n 行。使用这个
perl -ne 'if ($. == 3) {print;exit}' infile.txt
我只能提取一行。如何将一系列行放入此脚本中?
如果您只有一个范围和一个可能串联的输入流,则可以使用:
#!/usr/bin/perl -n
if (my $seqno = 1 .. 3) {
print;
exit if $seqno =~ /E/;
}
但如果您希望它应用于每个输入文件,您需要捕获每个文件的结尾:
#!/usr/bin/perl -n
print if my $seqno = 1 .. 3;
close ARGV if eof || $seqno =~ /E/;
如果你想善待那些忘记参数的人,请在BEGIN
or INIT
clause:
#!/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/;
值得注意的点包括:
您可以使用-n
or -p
on the #!
线。你也可以放一些(但是not所有)其他命令行开关 http://perldoc.perl.org/perlrun.html#Command-Switches在那里,像‑l
or ‑a
.
数字文字为
标量触发器的操作数
每个运算符都与readline
计数器,所以是一个标量1 ..
3
是真的($. == 1) .. ($. ==
3)
.
Calling eof
没有任何论点也不是空括号表示最后读取的文件magic ARGV
文件列表。这与eof()
,这是结束entire <ARGV>
迭代。
触发器运算符的最终序列号以"E0"
附加到它。
The -t
运算符,调用 libc 的isatty(3)
,默认为STDIN
句柄——与任何其他文件测试操作符不同。
A BEGIN{}
块发生在编译期间,因此如果您尝试使用以下命令反编译此脚本‑MO=Deparse
要查看它到底做了什么,将执行该检查。与INIT{}
, 它不会。
这样做将揭示隐式输入循环作为一个名为LINE
您也许可以在其他情况下利用它来发挥自己的优势。
HTH
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)