質問させていただきます。
メールヘッダに対して以下のプログラムを実行します。
ソースコード
~略
my $file_data_str = join("", @file_data);
my @received_datas = split(/Received:/, $file_data_str);
my @received_datas = reverse(@received_datas);
foreach my $sorted(@received_datas){
if($sorted =~ /by\s\w+.abc.jp/){
$sorted =~ /(\[\d+\.\d+\.\d+\.\d+\])/;
print $sorted;
print "\n";
}
}
}
exit;
を実行すると以下のようにに実行結果が出てきます。
from 158.217.207.30 (114.114.96.20 [114.114.96.20])
by ************abc.jp
from ****************.jp (***************.jp [158.217.208.15])
by ***********abc.jp
私は [114.114.96.20]だけを取りだしのですがどうしたらいいでしょうか?
foreach my $sorted(@received_datas){
if($sorted =~ /by\s\w.abc.jp/){
$sorted =~ /(\[\d+\.\d+\.\d+\.\d+\])/;
ここをどうにかすればいけると思うのですが詰まってしまって…
申し訳ないですが助言をお願いします。
No.3
- 回答日時:
ifでマッチした後でも$1は有効だったかと思います。
foreach $sorted (@received_datas){
if(($sorted =~ /by\s\w+.abc.jp/)and
($sorted =~ /\[(\d+?\.\d+?\.\d+?\.\d+?)\]/)){
$ipadd = $1;
print "ip $ipadd\n";
last; #<-ループを抜ける
}
}
\d.+? は最短一致(最も短く数字だけを抜き出す)
\d.+は最長一致(最も長く数字だけを抜き出す) の違いになります。\.があるので今回の場合はなくてもいいです。
\wはハイフンは入らないですが大丈夫ですね?
最終的にhirotn様が書いてくれたような同じようなプログラムになりました。本当に助かりました。ありがとうございます。
\wに関しては今回は大丈夫でした。ご忠告ありがとうございます。
No.1
- 回答日時:
この状態だと、 $sorted =~ /(\[\d+\.\d+\.\d+\.\d+\])/; は何も効果ありません。
この式は、 $sorted を対象として、 /(\[\d+\.\d+\.\d+\.\d+\])/ にマッチするかどうかの評価をします。
しかし、$sortedは検索対象に使っただけで変換はしません。そのため、print $sorted;では、元々の文章がそのまま出力されます。
正規表現中()で抽出していますが、その抽出した$1を使っていません。
$sorted自体を変更する(foreachの性質上、@recieved_datas自体も書き変わる)なら、 s/// で()の中だけ残すとか。
$sorted =~ s/.*(\[\d+\.\d+\.\d+\.\d+\]).*/$1/ ; # 前後を削除
抜き出したものだけ使いたいなら、内容が変化する前なら$1 を使うとか、$1を別な変数に代入するとか。
print $1 . "\n" ; # $1をそのまま使う
$IPaddress = $1 ; # 別な変数に代入する
この回答への補足
ご回答ありがとうございます。
質問した後、ちょこちょこいじりつつ、kmee様の回答を参考にしました。
if(($sorted =~ /by\s\w+.abc.jp/) and
($sorted =~ /(\[\d+\.\d+\.\d+\.\d+\])/)){
$& =~ /(\d+\.\d+\.\d+\.\d+)/;
$ipadd = $1;
print $ipadd;
print "\n";
}
}
}
exit;
最終的に”[]”このかっこがない状態で出力したいので
$& =~ /(\d+\.\d+\.\d+\.\d+)/;
をいれています。
一応結果として$&にはIPアドレスはでるのですが、初めの質問に書いたメールヘッダのそれぞれのReceivedフィールドのIPアドレスが抽出されています。(以下のように)
114.114.96.20 #ここだけほしい
158.217.208.15
上の一つだけのIPアドレスを出力するにはどうしたらいいでしょうか。
申し訳ありませんが、続けて助言お願いできませんか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 英語 unconditionalとは? 3 2022/08/26 21:31
- Ruby パイソンプログラム 1 2022/04/02 06:40
- Outlook(アウトルック) 休みが明けてメールをみたらやばいです 3 2022/08/17 09:03
- その他(プログラミング・Web制作) ColabでのPytorchのエラー 1 2022/11/19 20:51
- オープンソース p-nand-q.comのSorted!のソフトウェアライセンスはどう解釈すべきか Soeted!と 1 2023/05/10 15:59
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- 英語 英文の添削お願いします。【長文です。】 マッチングアプリで相手を言い負かしている時のやつです。 色々 1 2023/07/01 02:12
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
ファイルをディレクトリ分配の...
-
openした後、closeしないでプロ...
-
perlのプログラミング 部分入れ...
-
Perlのエラーについてご教授く...
-
画像が表示でnull; this.src
-
perlプログラミング 空白行削除
-
Perlで特定文字列から特定文字...
-
ラズベリーパイ初心者です。 ラ...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
Perlで特定文字列から特定文字...
-
perlをバージョンアップしたら...
-
Wallpaper Engineでおすすめの...
-
arduino の割り込み処理について
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
Perlで時間の計算
-
このファイルを開く方法で困っ...
-
TeraPadエディターの操作方法に...
-
cgiでサーバーにファイルを追加...
-
フローチャート 九九
-
LinuxにおいてのPerlのプログラ...
-
perl 初等プログラミングについて
-
Perlのエラーについてご教授く...
-
こんにちは ブラケッツでプログ...
-
bashスクリプト
-
perlプログラミング 空白行削除
おすすめ情報