サーチ…


ファイルを読む:foreachとwhile

潜在的に大きなファイルを読み込む場合、 whileループはforeach比べてメモリのメリットが大きくなります。以下は、レコードによって、ファイルレコードを読み込みます(デフォルトでは、「レコードは」で指定された「行」、意味$/各1割り当てる) $_ 、それが読まれるよう:

while(<$fh>) {
    print;
}

ダイヤモンド演算子は、ループが "0"文字だけを含む行末ではなく、ファイルの終わりで終了することを確認するためにここでいくつかの魔法を使います。

次のループはまったく同じように見えますが、リストコンテキストでダイヤモンド演算子を評価して、ファイル全体を一度に読み取ることができます。

foreach(<$fh>) {
    print;
}

とにかく一度に1つのレコードで操作していると、膨大なメモリが浪費され、回避する必要があります。

長いリストの処理

あなたが既にメモリにリストを持っているなら、それを処理する簡単で通常十分な方法は簡単なforeachループです:

foreach my $item (@items) {
    ...
}

これは$item何らかの処理を行い、データを保存せずにファイルに書き出すという一般的なケースでは問題ありません。ただし、アイテムから他のデータ構造を構築した場合、 whileループはメモリ効率が向上します。

my @result;
while(@items) {
    my $item = shift @items;
    push @result, process_item($item);
}

$itemへの参照が結果リスト内で直接終了しない限り、 @items配列からシフトした項目は解放され、次のループの繰り返しを入力するとインタプリタによってメモリが再利用されます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow