• 締切済み

[Perl]抽出について

再度質問させていただきます。 本当は質問などせずに自力で解決したいのですがなかなかうまくいかなくて困っています… 前回質問させていただいたとき(http://okwave.jp/qa/q7855819.html)には問題なかったのですが、事情がかわってしまい、ifの中の条件を変更しなければならなくなりました。今回はIPアドレスではなく時間抽出です。 以下のメールヘッダに対して、後述するプログラムを実行します。 Received: from ************.jp (**********.jp [158.217.43.2]) by **********.abc.jp ; Wed, 29 Feb 2012 12:17:31 Received: from ************** (localhost [127.0.0.1]) by localhost (Postfix) with SMTP ; Wed, 29 Feb 2012 12:16:23 Received: from **************.jp (***********.jp [158.217.208.11]) by ************.abc.jp ; Wed, 29 Feb 2012 12:15:54 #ここがほしい Received: from **************.jp (***********.jp [158.217.208.11]) by ************.xyz.jp ; Wed, 29 Feb 2012 12:15:14   From: ************** To: *********@***********abc.jp Subject: = ***** Date:Wed, 01 Mar 2012 21:06:24   #ここがとれてしまう . . . 本文 ~略 $file_data_str = join("", @file_data); @received_datas = split(/Received:/, $file_data_str); @received_datas = reverse(@received_datas); foreach $sorted(@received_datas){ if(($sorted =~ /abc.jp/) and ($sorted =~ /(\w+,\s+\d+\s+\w+\s+\d+\s+\d+:\d+:\d+)/)){   $new_file_name = str2time($1);   $min1 = $new_file_name / 300;   $min1_cut = int( $min1 );   print $min1_cut; last; } } } exit; まず、Received:で区切って、reverseしているのではじめの要素は、元のメールヘッダの最後のReceivedフィールドから本文まであることになります。更にIfで指定してる条件のアドレスがTo:にも出現するのでそこも判定されます。なのでプログラムを実行すると、To:のabc.jpとDateの時間にひっかかってしまい、Dateの時間情報を抽出してしまいます。 あくまで取りたいのはReceivedフィールドの中の時間情報なのですが、何かいいやり方はありませんでしょうか?ちなみに やり方としては、初めの要素を消す、shiftとか使えるかな、と考えたりもしましたがうまくいかず…、Receivedフィールドのみで判定させたいです。 ご教授願えたらと思います。よろしくお願いします。

みんなの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

Received: で split していますが、Received: 単位で配列に入れたほうが処理は簡単になると思います。次のような正規表現 (厳密には少し怪しいかも?) を使えば、配列に格納できます。 my @received_datas = $file_data_str =~ /(^Received:.+?(?=^[\w\-]+:))/msg;

blitzcrank
質問者

お礼

回答ありがとうございます。 したいことができました。 本当に感謝しています! いずれは私もここで質問に答える側になってみたいです。 ありがとうございました。

関連するQ&A