続・はじめての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自信が実行停止するような深刻なエラー メモリの使い切りなど 構文エラー 警告 警告をキャッチする方法は用意されている
感想
集中力が切れてこれだけの量のまとめに、ひどく時間がかかってしまった。
- 作者: Randal L. Schwartz,brian d foy,Tom Phoenix,吉川英興,伊藤直也,田中慎司,株式会社ロングテール/長尾高弘
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2006/10/21
- メディア: 大型本
- 購入: 9人 クリック: 389回
- この商品を含むブログ (99件) を見る