6

によって行われる暗黙のクローズを使用してもリセットされないPerlの状態のドキュメント。私はこれが何を意味するのかを正確に見ようとしていましたが、それを実現することができませんでした。これが私のスクリプトです:close$.open

use strict;
use warnings;
use autodie;
my @files = qw(test1.txt test2.txt test3.txt);

#try with implicit close
for my $file (@files){
    open my $fh, '<', $file;
    while(<$fh>){
        chomp;
        print "line $. is $_\n";
    }
    #implicit close here
}

そして、ここに読み込まれる3つのファイルすべての内容があります。

line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10

明示的には呼び出さないのでclose、暗黙的closeに使用する必要があり(私は思う)、$.リセットしないでください。ただし、スクリプトを実行すると、この出力が表示され、$が表示されます。リセットされます:

line 1 is line 1
line 2 is line 2
line 3 is line 3
line 4 is line 4
line 5 is line 5
line 6 is line 6
line 7 is line 7
line 8 is line 8
line 9 is line 9
line 10 is line 10
line 1 is line 1
line 2 is line 2
line 3 is line 3
line 4 is line 4
line 5 is line 5
line 6 is line 6
line 7 is line 7
line 8 is line 8
line 9 is line 9
line 10 is line 10
line 1 is line 1
line 2 is line 2
line 3 is line 3
line 4 is line 4
line 5 is line 5
line 6 is line 6
line 7 is line 7
line 8 is line 8
line 9 is line 9
line 10 is line 10

確かにリセットされているようです。ドキュメントの私の理解は間違っていますか?close暗黙のリセットが行われない状況を誰かに教えてもらえますか$.

ちなみに、私はストロベリー5.16.1を使用しています。

4

1 に答える 1

10

$.は実際にはグローバル変数ではなく、最後に読み取られたファイルハンドルの属性です。また、ループの各反復で新しいファイルハンドルを使用しています。

このようにコードを変更すると、次のように「修正」されます。

my $fh;
for my $file (@files){
    open $fh, '<', $file;
于 2013-01-25T00:42:05.013 に答える