sironekotoroの日記

Perl で楽をしたい

はじめての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がファイルハンドルだと判断するのです。