はじめてのPerl 第6版 第5章 入出力 の途中
はじめてのPerl 第6版 第5章 入出力
いきなり謎が解ける
メーリングリストやフォーラムには、1 ~ 2 週間ごとに、「Perl が、2 行目以降をすべてインデントしてしまいます」といったタイトルのメッセージが繰り返し投稿されています。
われわれ筆者はメッセージ本文を読まなくても、このタイトルを見ただけで、そのプログラム では、chomp してない文字列が入った配列をダブルクォートで囲んでいる、と原因を特定できます。
print "改行コードついたままで配列を展開\n"; my @array = ("1\n", "2\n", "3\n"); print "@array"; # 1 # 2 # 3 print "改行コードを削除して配列を展開\n"; foreach (@array){ chomp $_; } print "@array"; # 1 2 3
UNIXという考え方でみた!
このようなパイプラインは、Unix でも、ほかの多くのシステムでも良く使われます。なぜなら、 パイプラインを使うことによって、シンプルな標準の基本部品をもとにして、強力で複雑なコマンドを組み立てられるからです。それぞれの基本部品は 1 つの作業を上手にこなすようになっており、それらをうまく組み合わせて使うのがあなたの仕事です。
die
$!に意味のある値が入っているのは、システムに対する要求が失敗した直 後だけです。要求が成功した場合、$!には有用な情報はセットされません。
(中略)
「使い方の誤りを示すメッセージには改行文字を入れ、デバッグ中に追跡した いエラーならば改行文字を入れない」。
open の戻り値は必ずチェックしなければなりません。なぜなら、プログラムの残り部分を実 行するには、open が成功していなければならないからです。
autodie
autodieプラグマを1回だけ書いておけば、openが失敗した場合に自動的に dieしてくれ るようになります
use autodie; open LOG, '>>', 'logfile';
ファイルハンドル
ファイルハンドルの直後には、やはりコンマを置いていないこ とに注意してください。Perl は、printの次に現れる物の直後にコンマが無いことによって、 $rocks_fhがファイルハンドルだと判断するのです。