ファイルハンドルを閉じる
close
はファイルハンドルと関連付けられたファイルやパイプを閉じ、IO バッファをフラッシュし、システムファイルディスクリプタを閉じます。
すべての処理が成功し、PerlIO レイヤからのエラーがなければ真を返します。
もし引数が省略されたら、現在選択されているファイルハンドルを閉じます。
もし直後に再度 open
を使って同じ FILEHANDLE を開くのであれば、
その FILEHANDLE を閉じる必要はありません。
なぜなら、open
はその FILEHANDLE を事前に閉じてくれるからです。
しかし、入力ファイルで明示的に close
を使って閉じれば、行カウンタ
($.) をリセットしてくれます。
open
によって暗黙的にファイルハンドルが閉じられるとリセットされません。
次のサンプルコードは、3 行のテキストファイルを読み取りオープンし、すべての行を読み取った後に close
でファイルを閉じます。
各ステップごとに $. の値を出力します。
open my $fh, '<', './sample.txt'; # 3 行のテキストファイルを開く
print $., "\n"; # ファイルを開いた直後は行カウンタは 0
while (<$fh>) {
print $., "\n"; # 行カウンタは 1, 2, 3 と増える
}
print $., "\n"; # 行カウンタは 3
close $fh; # ファイルを閉じる
print $., "\n"; # 行カウンタは 0 にリセットされる
結果をご覧の通り、close
を明示的に呼び出してファイルを閉じることで、$. の値がリセットされていることが分かります。
一方で、close
でファイルを明示的に閉じず、再度 open
を使って同じファイルを開いてみます。
open my $fh, '<', './sample.txt'; # 3 行のテキストファイルを開く
while (<$fh>) { }
print $., "\n"; # 行カウンタは 3
open my $fh, '<', './sample.txt'; # 閉じずに再度同じテキストファイルを開く
print $., "\n"; # 行カウンタはリセットされずに 3 のまま
while (<$fh>) {
print $., "\n"; # 行を読み始めると行カウンタは正しくセットされ、1, 2, 3 と増える
}
結果をご覧の通り、再度ファイルを開いた直後の行カウンタが 3 のままになっています。 しかし、行を読み進めると $. には実際の行番号がセットされます。