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 man-page の「I/O Operators」を参照してください。)

あなたの場合のように、コマンドライン引数があるかどうかに関係なく標準入力から読み取りたい場合は、<STDIN>代わりに次を使用する必要があります。

while ( defined ($line = <STDIN>) && $line_num < $ARGV[0]) {
于 2012-07-14T21:38:44.100 に答える
1

必須のワンライナー:

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

$.から読み取った行数をカウントしstdinます。-n暗黙的にプログラムをラップします:

while (<>) {
   ...program...
}
于 2012-07-14T22:35:05.987 に答える
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 に答える
0

awk を使用してこれを非常に簡単に行うこともできます。

awk 'NR==10000' < file

またはシード:

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