所以,假设我正在编写一个Perl程序:
./program.perl 10000 < file
我希望它只读取第10000行的“文件”。我怎么能用这种形式的输入重定向呢?似乎我不断得到10000行的东西不是文件。
我认为这样可行:
#!/usr/bin/perl -w
$line_num = 0;
while ( defined ($line = <>) && $line_num < $ARGV[0]) {
++$line_no;
if ($line_no == $ARGV[0]) {
print "$line\n";
exit 0;
}
}
但它失败了。
答案 0 :(得分:3)
如果有命令行参数,则<>
打开所谓的文件并从中读取,如果没有,则从标准输入获取。 (见"I/O Operators" in the perlop man-page。)
如果您希望从标准输入中读取是否存在命令行参数,那么您需要使用<STDIN>
代替:
while ( defined ($line = <STDIN>) && $line_num < $ARGV[0]) {
答案 1 :(得分:1)
您可以使用Tie::File
use Tie::File;
my ($name, $num) = @ARGV;
tie my @file, 'Tie::File', $name or die $!;
print $file[$num];
untie @file;
<强>用法:强>
perl script.pl file.csv 10000
答案 2 :(得分:1)
强制性单行:
perl -ne 'print if $. == 10000; exit if $. > 10000'
$.
计算从stdin
读取的行数。 -n
隐式包含程序:
while (<>) {
...program...
}
答案 3 :(得分:0)
您也可以使用awk简单地执行此操作:
awk 'NR==10000' < file
或sed:
sed -n '10000p' file