お世話になります。
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.2
- 回答日時:
どのくらいの大きさのプログラムで, どんなことをしたいんですか? それによって「どう書けばいいか」は変わってきますよ.
例えば, ここに挙がっているくらいのことなら, 私はファイルのオープンなどしません. 標準入力から読み込んで標準出力に書き出すようにします. そうすれば, 「美しい書き方」なんかで悩まなくってすむ.
この回答への補足
ううーん、ちょっとお礼で不必要に八つ当たりしていますね・・・。
申し訳ありません。
私の考えでは、Perlには「文脈を読んで、ファイルハンドルが渡されたときはファイルハンドルが渡されたと察して欲しい」と思います。
ありがとうございます。
ううん、「そもそも何をしたいんですか」というのは、コンピューターの世界で頭がいい人が頭が悪い人をやりこめるときに使う典型的な表現ですね。。
それだと、頭が悪い人は言い返せなくなってしまいますが、「本当に聞きたかったこと」は聞けなくて、モヤモヤした気持ちが残ることになりませんか。
分かっておられるとおり、まさか、このコードの作例をそのまま使おうとは思いません。
もしそうであれば、私はそもそもプログラミングなどせず、UNIXであればcat、Windowsであればtypeを使います。
私は、最近のベストプラクティスとして、ファイルハンドルにベアワードを使わず、スカラー変数を使うということを聞きかじって、でも暗黙的な$_と併用すると問題が起きるな、と一般的に思っただけです。
推奨される書き方をして、$_がむき出しになるのは異様に思えたので、何か私が見落としている、勘違いしているのであれば、それを聞きたいと思ったんです。
そうではない、ということですね。
「美しい書き方」なんかで悩むのは、そもそも意味がない、ということでしょうか。
そうであれば確かに私はそうは思っていませんでした。
いずれにせよ、ありがとうございます。
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;
の方が美しいような。。
ありがとうございます。
お探しの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ランキング
-
close()で例外が投げられる理由
-
PICでFatFsでオープンした内容...
-
Perl で syntax error
-
perlのflock関数でロックをかけ...
-
VBAコードを張り付け後のエクセ...
-
バッチファイルの作り方(CSV→...
-
batファイルでrenameができませ...
-
vba dir の相対パス
-
MATLABのm-fileについて
-
文字列をカウントする方法
-
至急お願いします。C言語で.img...
-
一定時間が経過したフォルダの削除
-
JavaでCSVファイルを高速に読む...
-
画像アップロード機能を追加し...
-
csvファイルの横方向への改行に...
-
Perlで特定行から特定行までを...
-
【エクセル】改行無しテキスト...
-
perlのエディタでおすすめを教...
-
フォルダ内のファイルを全て開...
-
VBAでCSVファイルの特定行を書...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlのflock関数でロックをかけ...
-
改行コードが勝手に
-
巨大ファイルの行をを逆順に並...
-
オープンしたファイルで行の連結
-
Perl で syntax error
-
where can I buy snowbord in t...
-
open中のファイルをrename
-
perlを用いた特定文字列間の抽...
-
Perlで他サイトの情報を取得し...
-
die関数のエラー出力先について
-
ハッシュにファイルハンドル
-
サブスクリプトとのファイルハ...
-
テキストファイルの本文中に行...
-
perlで大容量CSVのsort方法につ...
-
フォルダが開かなくなりました。
-
AutoCADのスクリプト
-
ジョブショップスケジューリング
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
おすすめ情報