プロが教えるわが家の防犯対策術!

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

よろしくお願いします。

A 回答 (2件)

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



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

この回答への補足

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

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

補足日時:2013/07/12 01:26
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

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

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

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

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

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

お礼日時:2013/07/12 00:51

残念ながら


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

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

この回答への補足

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

#! /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
    • good
    • 0
この回答へのお礼

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

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

ありがとうございます。

お礼日時:2013/07/10 00:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!