1

所以,假设我正在编写一个 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;
    }
}

但失败得很惨。

4

4 回答 4

3

如果有命令行参数,则<>打开所谓的文件并从中读取,如果没有,则从标准输入中获取。(请参阅perlop 手册页中的“I/O 运算符”。)

如果像您的情况一样,您想从标准输入中读取是否有命令行参数,那么您需要<STDIN>改用:

while ( defined ($line = <STDIN>) && $line_num < $ARGV[0]) {
于 2012-07-14T21:38:44.100 回答
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
于 2012-07-14T21:40:05.257 回答
1

强制单行:

perl -ne 'print if $. == 10000; exit if $. > 10000'

$.计算从 读取的行数stdin-n将程序隐式包装在:

while (<>) {
   ...program...
}
于 2012-07-14T22:35:05.987 回答
0

您也可以使用 awk 非常简单地做到这一点:

awk 'NR==10000' < file

或 sed:

sed -n '10000p' file
于 2012-09-23T14:51:11.897 回答