• ベストアンサー
  • すぐに回答を!

[Perl]抽出、出力について

  • 質問No.7855819
  • 閲覧数216
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 26% (4/15)

質問させていただきます。

メールヘッダに対して以下のプログラムを実行します。

~略
$file_data_str = join("", @file_data);
@received_datas = split(/Received:/, $file_data_str);
@received_datas = reverse(@received_datas);
foreach $sorted(@received_datas){
if(($sorted =~ /by\s\w+.abc.jp/) and ($sorted =~ /(\[\d+\.\d+\.\d+\.\d+\])/)){
$& =~ /(\d+\.\d+\.\d+\.\d+)/;
$ipadd = $1;
print $ipadd;
print "\n";
}
}
}
exit;

すると、by\s\w+.abc.jpを含むReceived行のIPアドレスが全て抽出され、複数出力されます。(以下実行結果)
114.114.96.20
158.217.208.15

私はこの初めの"114.114.96.20"のみを出力したいのですが、どうしたらいいでしょうか?
助言のほどをお願いいたします。

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー

ベストアンサー率 55% (1857/3366)

114.114.96.20
158.217.208.15

この2つの違いは?
具体的、どんなものは出力したくて、どんなものは出力したくないのですか?
前回の続きだとして

・最初に見つかったものだけを出力したい

1つ出力したところで、lastとかでループから抜ける。
出力したかどうか、何番目かを記憶する変数を用意して、1つめのときだけ出力する 等

・( IPアドレス [IPアドレス])になっている行だけを出力したい
→ ifで判定する条件を、これだけがマッチするようにする

・IPアドレスが特定の範囲だったら
→抜き出したIPアドレスから値を取り出し、その範囲かどうかを判定する

など、目的が違えば、やり方も変わります
補足コメント
blitzcrank

お礼率 26% (4/15)

kmee様、続けてありがとうございます。

"初めに見つかったものだけを出力したい"、ということでした。
目的がはっきりしていませんでした、申し訳ありません。

アドバイスとおりにすこしやってみます。
ありがとうございました。
投稿日時:2012/12/21 23:37
お礼コメント
blitzcrank

お礼率 26% (4/15)

lastをつければ一発でした。。。
なぜこんなことにきがつかなかったのか、猛省してます。

本当にお世話になりました。
ありがとうございました。
投稿日時:2012/12/21 23:39
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ