ケーズメモ このページをアンテナに追加 RSSフィード

2007-05-18

『初めてのPerl』17章 上級テクニック

ポイントと雑感

evalによるエラートラップ

eval{...};で囲むことによって、エラーが起こってもそのままプログラムは実行されエラーメッセージが$@に入っているという仕組みらしい。

#!/usr/bin/perl -w

use strict;

my ($fred, $dino) = (10, 0);

eval {my $barney = $fred / $dino}; # devided by zero
print "An error occuered: $@" if $@;

上記コードを実行するとこうなる。

$ ./eval_test
An error occuered: Illegal division by zero at ./eval_test line 7.

きちんとゼロ割をした行を補足してくれている。eval/$@でJavaのtry/catchみたいな感じですね。

また

my $barney = eval {$fred / $dino};

とすると除算が正しく実行された場合には$barneyに除算の結果が、エラーが起こった場合にはundefがセットされる。

evalでトラップできない問題は

  1. Perlそのものをクラッシュさせてしまうエラー
  2. シンタックスエラー
  3. evalブロック内でexit演算子を使った場合
  4. ユーザやPerlが内部的に生成した警告

1番目はeval自体が動くわけないのでトラップは不可能。2番目はコンパイル時にエラーになるので問題なし。3番目はexitは強制的にプログラムを終わらせるので、エラー対策ならdieを使えばよいとのこと。4番目はevalで捕捉する必要があるのかはいまいち不明。

grepを使ってリストから要素を選び出す

Unix/LinuxのコマンドにもあるgrepPerlでは

grep {(条件式)} (リスト)

という使い方をする。リストだけでなくファイルハンドルも読み込めるらしい。

mapを使ってリストを変換する

grepと同じような構文で

map {(処理)} (リスト)

とブロックの中が処理に変わっていて、ブロックの中で最後に評価された値が戻り値になる。

クォートなしのハッシュキー

ハッシュキーのクォートは省略できるらしい。

正規表現++

量指定子は欲張りマッチ(greedy match)なのでそれを控えめなマッチ(reluctant match)にするには量指定子の前に'?'を付ければいい。これで最長マッチが最短マッチに切り替わる。

また、アンカー('^'や'$')は文字列全体の先頭と末尾にマッチするのではなく、行の先頭と末尾にマッチする。途中に改行をはさむ文字列の場合には注意が必要。

スライス

うまい記法だなぁ。その局面局面で使っていって覚えていくという感じかな。


練習問題

ex17-1
#!/usr/bin/perl -w

use strict;

open my $rfh, "<", "sample_text"
    or die "Cannot open 'sample_text': $!";

chomp(my @data = <$rfh>);

close $rfh;

my $pattern;

while (1) {
    print "input pattern: ";
    chomp($pattern = <STDIN>);

    last if $pattern =~ /^\s*$/;

    my @matches = eval {
        grep /$pattern/, @data;
    };

    if ($@) {
        print "Error occured: $@";
    }
    else {
        my $count = scalar @matches;
        print "$count time(s) matched:\n",
            map "$_\n", @matches;
    }
    print "\n";
}

sample_textはO'Reillyのサイトからダウンロードしたもの。エラートラップはeval, リストマッチにgrep, 出力フォーマットにmapと出てきたことを一通り使ってみたら模範解答とほとんど同じ結果に。


まとめ

  • evalによるエラートラップを学んだ
  • リスト処理のgrep, mapを学んだ
  • スライスについて学んだ(書いてないけど)

これで『初めてのPerl』はほぼお仕舞いなので

をやることにします。その前に「もう少し続くんじゃ」ということで付録Bを読んだメモと本全体のまとめのエントリを書きます。


スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ksmemo/20070518/p1