1

<> から 100 KB を読み取り、テストを行ってから 100 KB を戻して、後で <> が読み取れるようにしたいと考えています。

メタコード:

$data100kb = read(<>,100000);
testing($data100kb);
unget(<>,$data100kb);
while(<>) {
  do stuff;
}

<> が実際のファイル、パイプ、または実際のファイルの連結を提供するかどうかは事前にわかりません。したがって、次のように動作するはずです:

cat bigfile_a bigfile_b | perl my_program

bigfile が 1000*RAM サイズであると仮定すると、入力のコピーは法外なコストがかかります。

STDIN からしか読み取れなくても構いません。

バックグラウンド

最初の 100kb は、完全な入力を解析する方法を教えてくれますが、パーサーはこの入力も必要とします。

4

3 に答える 3

1

これはSTDINで機能するようです。もっと早くできたら最高です。

read(STDIN, $first, 100000);
unget($first);

compute($first);

while($_=get_line()) {
    # Similar to while(<>)
}

my @line_cache;
sub get_line {
    if(@line_cache) {
        my $line = shift @line_cache;
        if(@line_cache) {
            # not last line                                                                                                            
            return $line;
        } else {
            # last line - may be incomplete                                                                                            
            if(substr($line, -1, 1) eq $/) {
                # Line is complete                                                                                                     
                return $line;
            } else {
                return $line. scalar(<STDIN>);
            }
        }
    } else {
        return scalar(<STDIN>);
    }
}

sub unget {
    for(@_) {
        # Split into lines                                                                                                             
        push @line_cache, split m:(?<=$/):;
    }
}
于 2013-10-14T11:28:41.893 に答える