Perl:ファイルハンドルをスカラー変数にすると変
お世話になります。
Perlの書き方について教えてください。
Perlのファイルハンドルで、昔はINやOUTやFILEのようにベアワード(裸のワード)を使っていたと思います。
★(プログラム1)
#! /bin/perl
#
# fh_bareword.pl
use strict;
use warnings;
open IN, '<', 'in.txt';
open OUT, '>', 'out.txt';
while (<IN>) {
print OUT;
}
close IN;
close OUT;
★(実行例)
C:\Perl\perl>type in.txt
This is a pen.
That is a book.
C:\Perl\perl>fh_bareword.pl
C:\Perl\perl>type out.txt
This is a pen.
That is a book.
★★★
ところが、これだとIN、OUTがグローバル名になってしまい、他のモジュールと衝突することがあるということで、myつきのスカラー変数にした方が良いと言われました。
それで、以下のように書いてみましたが、想定のように動作しません。
★(プログラム2)
#! /bin/perl
#
# fh_scalar.pl
use strict;
use warnings;
open my $in, '<', 'in.txt';
open my $out, '>', 'out.txt';
while (<$in>) {
print $out;
}
close $in;
close $out;
★(実行例)
C:\Perl\perl>fh_scalar.pl
GLOB(0x146ea34)GLOB(0x146ea34)
C:\Perl\perl>dir out.txt
ドライブ C のボリューム ラベルは eMachines です
ボリューム シリアル番号は 89C9-F870 です
C:\Perl\perl のディレクトリ
2013/07/09 23:05 0 out.txt
1 個のファイル 0 バイト
0 個のディレクトリ 23,226,032,128 バイトの空き領域
★★★
たぶん
print $out;
の部分で、私はファイルハンドル$outに$_を表示してくださいと意図していたのですが、「ファイルハンドルSTDOUTに$outを表示してください」という意図に受け取られたらしく、上記のようにGLOBのリファレンス?が表示されてしまいました。
print $out $_;
と書くと、確かに正しく表示されますが、これが正しい書き方なのでしょうか。
printの後ろに来るのは出力する文字列ではなくファイルハンドルだと、正しく判断してもらえるもっと美しい書き方はあるのでしょうか。
よろしくお願いします。