![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
お世話になります。
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の後ろに来るのは出力する文字列ではなくファイルハンドルだと、正しく判断してもらえるもっと美しい書き方はあるのでしょうか。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
この回答への補足
もしかして、$_も流行らないんでしょうかねェ。。
#! /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で生きて生きたいんですけど、たとえば発表会とかでそう書いていると笑われるレベルなんでしょうかねぇ~~
なんと!そうなのですか。
ううーん、それだと
open OUT '>', 'out.txt';
~
print OUT;
の方が美しいような。。
ありがとうございます。
No.2
- 回答日時:
どのくらいの大きさのプログラムで, どんなことをしたいんですか? それによって「どう書けばいいか」は変わってきますよ.
例えば, ここに挙がっているくらいのことなら, 私はファイルのオープンなどしません. 標準入力から読み込んで標準出力に書き出すようにします. そうすれば, 「美しい書き方」なんかで悩まなくってすむ.
この回答への補足
ううーん、ちょっとお礼で不必要に八つ当たりしていますね・・・。
申し訳ありません。
私の考えでは、Perlには「文脈を読んで、ファイルハンドルが渡されたときはファイルハンドルが渡されたと察して欲しい」と思います。
ありがとうございます。
ううん、「そもそも何をしたいんですか」というのは、コンピューターの世界で頭がいい人が頭が悪い人をやりこめるときに使う典型的な表現ですね。。
それだと、頭が悪い人は言い返せなくなってしまいますが、「本当に聞きたかったこと」は聞けなくて、モヤモヤした気持ちが残ることになりませんか。
分かっておられるとおり、まさか、このコードの作例をそのまま使おうとは思いません。
もしそうであれば、私はそもそもプログラミングなどせず、UNIXであればcat、Windowsであればtypeを使います。
私は、最近のベストプラクティスとして、ファイルハンドルにベアワードを使わず、スカラー変数を使うということを聞きかじって、でも暗黙的な$_と併用すると問題が起きるな、と一般的に思っただけです。
推奨される書き方をして、$_がむき出しになるのは異様に思えたので、何か私が見落としている、勘違いしているのであれば、それを聞きたいと思ったんです。
そうではない、ということですね。
「美しい書き方」なんかで悩むのは、そもそも意味がない、ということでしょうか。
そうであれば確かに私はそうは思っていませんでした。
いずれにせよ、ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# [至急]Project Euler:#17Number letter countsコード入力出力解説 2 2022/09/24 02:46
- 英語 英文の添削お願いします。【長文です。】 マッチングアプリで相手を言い負かしている時のやつです。 色々 1 2023/07/01 02:12
- 英語 文の構造をご教示ください 2 2023/01/01 18:03
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
- Perl Perlのエラーについてご教授ください。初心者です。 CGIを別サーバに移したところ、Perlのバー 5 2023/05/31 10:48
- 工学 Pythonの3Dグラフ表示に関する質問です。 1 2022/12/06 15:03
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlで大容量CSVのsort方法につ...
-
Perl変数から外部プログラムの...
-
巨大ファイルの行をを逆順に並...
-
改行コードが勝手に
-
タブの色を変更する方法
-
Windowsで複数のファイルを同じ...
-
awkスクリプトでダブルクォーテ...
-
readdir()で得られるファイル・...
-
DOSコマンドで、標準出力を出力...
-
エクセルVBA コードが同じでも...
-
エクセルVBAで素数だけを出力す...
-
Perlでのファイル出力における...
-
vba dir の相対パス
-
csvファイル改行コードの置換に...
-
C言語初心者です。プログラミン...
-
文字列をカウントする方法
-
ifstream/ofstream について
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
改行コードが勝手に
-
perlを用いた特定文字列間の抽...
-
Perl で syntax error
-
ハッシュにファイルハンドル
-
where can I buy snowbord in t...
-
open中のファイルをrename
-
GD.pmで作成した画像を保存する...
-
perlで複数のファイルの処理に...
-
while(<ハンドラ>) {} で行数を...
-
パスワード自動生成スクリプト...
-
die関数のエラー出力先について
-
Perlでファイル出力時にデッド...
-
perlのflock関数でロックをかけ...
-
PICでFatFsでオープンした内容...
-
クリックを何回もされて、重複...
-
cgiの投票回数制限設定について...
-
ファイルから読み込んだ文字を
-
テキストファイルの本文中に行...
-
データの並べ替え
おすすめ情報