【发布时间】:2011-05-03 10:12:27
【问题描述】:
我想从我的 .csv 文件中提取第 1 到第 n 行。使用这个
perl -ne 'if ($. == 3) {print;exit}' infile.txt
我只能提取一行。如何将一系列行放入此脚本中?
【问题讨论】:
我想从我的 .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/;
如果您想善待忘记 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/;
值得注意的点包括:
您可以在#! 行上使用-n 或-p。您也可以将一些(但不是全部)其他command line switches 放在那里,例如‑l 或‑a。
数字文字为
标量触发器的操作数
每个运算符都进行比较
readline 计数器,所以标量 1 ..
3 实际上是 ($. == 1) .. ($. ==
3)。
调用eof 时既没有参数也没有空括号 表示在magic ARGV 文件列表中读取的最后一个文件。这与eof() 形成对比,eof() 是 整个 <ARGV> 迭代的结束。
返回触发器运算符的最终序列号,并附加一个"E0"。
-t 运算符调用 libc 的 isatty(3),默认为 STDIN 句柄 — 与任何其他文件测试运算符不同。
编译期间会出现BEGIN{} 块,因此如果您尝试使用‑MO=Deparse 反编译此脚本以查看它的实际作用,该检查将执行。使用INIT{},则不会。
这样做会显示隐式输入循环作为一个名为 LINE 的标签,您可能会在其他情况下使用它来发挥您的优势。
HTH
【讨论】:
有什么问题:
head -3 infile.txt
如果你真的必须使用 Perl,那么这个方法可行:
perl -ne 'if ($. <= 3) {print} else {exit}' infile.txt
【讨论】:
head 的问题在没有 cygwin 的 Windows 上运行。
perl -wpe'1..3 or exit' infile.txt
您可以使用范围运算符:
perl -ne 'if (1 .. 3) { print } else { last }' infile.txt
【讨论】: