みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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の後ろに来るのは出力する文字列ではなくファイルハンドルだと、正しく判断してもらえるもっと美しい書き方はあるのでしょうか。

よろしくお願いします。

投稿日時 - 2013-07-09 23:15:18

QNo.8169778

すぐに回答ほしいです

質問者が選んだベストアンサー

残念ながら
print $out $_;
でがまんしてください.

参考URL:http://perldoc.perl.org/functions/print.html

投稿日時 - 2013-07-10 00:19:20

補足

もしかして、$_も流行らないんでしょうかねェ。。

#! /bin/perl
#
# fh_scalar.pl

use strict;
use warnings;

open my $in, '<', 'in.txt';
open my $out, '>', 'out.txt';

while (my $str = <$in>) {
 print $out $str;
}

close $in;
close $out;

とか?
ううん、ぼくの知ってるあの簡潔なPerlじゃないような・・・・・・

やっぱりINとOUTで生きて生きたいんですけど、たとえば発表会とかでそう書いていると笑われるレベルなんでしょうかねぇ~~

投稿日時 - 2013-07-10 08:44:33

お礼

なんと!そうなのですか。
ううーん、それだと
open OUT '>', 'out.txt';

print OUT;
の方が美しいような。。

ありがとうございます。

投稿日時 - 2013-07-10 00:30:48

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

どのくらいの大きさのプログラムで, どんなことをしたいんですか? それによって「どう書けばいいか」は変わってきますよ.

例えば, ここに挙がっているくらいのことなら, 私はファイルのオープンなどしません. 標準入力から読み込んで標準出力に書き出すようにします. そうすれば, 「美しい書き方」なんかで悩まなくってすむ.

投稿日時 - 2013-07-11 00:15:46

補足

ううーん、ちょっとお礼で不必要に八つ当たりしていますね・・・。
申し訳ありません。

私の考えでは、Perlには「文脈を読んで、ファイルハンドルが渡されたときはファイルハンドルが渡されたと察して欲しい」と思います。

投稿日時 - 2013-07-12 01:26:52

お礼

ありがとうございます。

ううん、「そもそも何をしたいんですか」というのは、コンピューターの世界で頭がいい人が頭が悪い人をやりこめるときに使う典型的な表現ですね。。
それだと、頭が悪い人は言い返せなくなってしまいますが、「本当に聞きたかったこと」は聞けなくて、モヤモヤした気持ちが残ることになりませんか。

分かっておられるとおり、まさか、このコードの作例をそのまま使おうとは思いません。
もしそうであれば、私はそもそもプログラミングなどせず、UNIXであればcat、Windowsであればtypeを使います。

私は、最近のベストプラクティスとして、ファイルハンドルにベアワードを使わず、スカラー変数を使うということを聞きかじって、でも暗黙的な$_と併用すると問題が起きるな、と一般的に思っただけです。

推奨される書き方をして、$_がむき出しになるのは異様に思えたので、何か私が見落としている、勘違いしているのであれば、それを聞きたいと思ったんです。
そうではない、ということですね。

「美しい書き方」なんかで悩むのは、そもそも意味がない、ということでしょうか。
そうであれば確かに私はそうは思っていませんでした。

いずれにせよ、ありがとうございます。

投稿日時 - 2013-07-12 00:51:05

あなたにオススメの質問