dポイントプレゼントキャンペーン実施中!

はじめまして。
現在perlで簡単なRSSリーダーを作っています。
簡単に書けば下記のようなスクリプトです。

use LWP::Simple;
use XML::RSS;
foreach(@hoge) { # @hogeはrssファイルのURL
$SIG{ALRM} = sub{ die("alarm_error"); };
alarm 10;
$rss->parse($_);
alarm 0;
}

rssファイルをとりにいって10秒たって取得できなければnextで次のrssファイルへという形にしたいのですがどうもやり方がわかりません。

いろんなところで調べてもタイムアウト後はdie等によって強制終了するやり方しか見つかりませんでした。

タイムアウト後nextを使えるやり方をご存知のかたおられたらお教えください。
よろしくお願いします。

A 回答 (1件)

die は eval で捕捉できるので、このようなケースでは次のようにします。



foreach (@hoge) {
  eval {
    local $SIG{ALRM} = sub { die "TimeOut" };
    alarm 10;
    $rss->parse($_);
    alarm 0;
  };
  if ($@ =~ /TimeOut/) {  # $@ には die のパラメータなどが設定される
    # タイムアウト時の処理
  }
}

タイムアウト時の処理が不要な場合は、if ($@ ~) { ・・・ } を削除して下さい。

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。
    • good
    • 0
この回答へのお礼

おかげ様で解決することができました。
evalで回避する方法があったんですね。
勉強不足でした...

ありがとうございました。

お礼日時:2005/03/18 17:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!