続・はじめてのPerl 2章

まとめ。

2章 中級者の基礎知識

2.1 リスト演算子
print
    1つ以上の引数を与えると1つにまとめる
        もっともよく使われるリスト演算子

sort
    入力リストを順番に並べ返す

reverse
    逆順のリストを返す

その他にも多くのリスト演算子
2.1.1 grepによるリストのフィルタリング
grep EXPR,LIST
grep BLOCK LIST
    値のリストと、テスト式を受け取る
        リスト内のアイテムを1つずつ、$_に格納。テスト式で評価
            テスト式はスカラーコンテキストで評価される
                真と評価された場合、出力リストに$_を渡す

    リストコンテキストの場合
        真と評価されたアイテムをすべてリストとして返す

    スカラーコンテキストの場合
        真と評価されたアイテムの総数を返す

    EXPR は、$_を参照するスカラー式
        $_ は省略することが可能

    $_ は、処理後元の値になる

    $_ は、単なるコピーではなく、実体のエイリアス
my @input_numbers = qw/ 1 2 4 8 16 32 64 /;

# $_ の明示的な参照
my @bigger_than_10 = grep $_ > 10, @input_numbers;
print "@bigger_than_10\n";    # 16 32 64

# $_ の暗黙的な参照
my @end_in_4 = grep /4$/, @input_numbers;
print "@end_in_4\n";    # 4 64
テスト式が複雑な場合、サブルーチンにすることが可能
    
サブルーチンを式形式で表すと以下のようになる
my @odd_digit_sum = grep digit_sum_is_odd( $_ ), @input_numbers;
print "@odd_digit_sum\n";    # 1 16 32

sub digit_sum_is_odd {
    my $input = shift;
    my @digits = split //, $input;
    my $sum = ();
    $sum += $_ for @digits;
    return $sum % 2;    # テスト式で評価される値
}
サブルーチンをブロックで表すと以下のようになる
     ブロック内でreturnすると、コード全体を終了する
@odd_digit_sum = grep {
    my $sum = ();
    $sum += $_ for split //;
    $sum % 2;    # テスト式で評価される値, return は取り除く
    } @input_numbers;
print "@odd_digit_sum\n";    # 1 16 32
2.1.2 mapによるリストの変換
grepとよく似ている
    リストアイテムを1つずつ$_に格納
    式形式とブロック形式の構文を持つ

リストコンテキストで式を評価
    結果の一部を生成する
        入力について出力が1つという制約はない
my @input_numbers = qw/ 1 2 4 8 16 32 64 /;
my @result = map{ $_, 3 * $_ } @input_numbers;
print "@result\n";  # 1 3 2 6 4 12 8 24 16 48 32 96 64 192
式の結果が、空リストの場合
    最終的に返されるであろうリストに、空リストを追加する
        最終的なリストは変わらない
my @input_numbers = qw/ 1 2 4 8 16 32 64 /;
my @result = map {
    my @digits = split //;
    if ( $digits[-1] == 4 ) {
        @digits;
    }
    else {
        ( );
    }
} @input_numbers;
print "@result\n";  # 4 6 4
mapはgrepの代わりに使える
    grepはmapの代わりには使えるとは限らない

mapもgrepもforeachで明示的に書くことが可能
2.2 evalによるエラーのトラップ
evalブロック内のコードでエラーが起きると...
    Perlはブロック直後から実行を続ける
    $@には、エラーメッセージが格納される
        エラーが起きていなければ、$@は空

evalは関数
    ifやwhileのような制御構文ではないので、ブロックの後にセミコロンが必要
    evalブロックでは、レキシカル変数の定義が可能
    サブルーチンと同じように値を返す
        returnで明示的に返す値
        最後に評価された式
            エラーが起きると、値を返さない
                スカラーコンテキストでは、undef
                リストコンテキストでは、空リスト

トラップできないエラー
    Perl自信が実行停止するような深刻なエラー
        メモリの使い切りなど

    構文エラー

    警告
        警告をキャッチする方法は用意されている

2.3 evalによるダイナミックコード
evalの2つ目の形式
    引数がブロックではなく、文字列
        実行時に文字列内のコードをコンパイル、実行する
            便利だが、文字列に信用できないデータが含まれる場合危険
                基本的に使わないようにするべき

    ブロックの場合と同じように、最後に評価した値を返す

    文字列のコンパイル、実行ができない場合、$@にエラーメッセージを格納

感想

集中力が切れてこれだけの量のまとめに、ひどく時間がかかってしまった。

続・初めてのPerl 改訂版

続・初めてのPerl 改訂版