• ベストアンサー

perlでファイルからメールアドレスを抽出

perlでエラーアドレスを抽出したく いろいろ調べてみましたがどうにもうまくいきません。 主に携帯アドレスが中心ですので RFCに基づいているというよりは簡易な正規表現で、 重複排除くらいはできると理想なのですが 既成で何かいいものはありませんかね? $format='[\w.-]+\@([\w-]+\.)+\w+'; # 簡略なメールアドレス正規表現 open(IN, "エラー.dbx"); foreach(<IN>) { if($_ =~ /($format)/){ push(@emails,$1."\n"); } } close(IN); print @emails; とか open(IN, 'エラー.dbx'); @data = <IN>; close(IN); foreach(@data){ s/ //g; print "$_\n" if /([\w._-]+@[\w._-]+)/ ; } 試してみましたがうまくいきませんでした。

  • Perl
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.2

これでどうかな? $myaddress='aaa@example.com'; # 自分のアドレス open(IN, "エラー.dbx"); foreach(<IN>){  if(/^To: .*?([-+\w.]+\@[-\w.]+\.\w{2,5})(\W|$)/ && $1 ne $myaddress){   push(@emails,$1."\n");  } } close(IN); print @emails; ※空白は変えてね!

その他の回答 (1)

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

携帯電話のメールアドレスは、規格外のものもあって難しいです。 参考サイトを紹介しておきますが、一筋縄では行かない。 【参考サイト】 Perlメモ( http://www.din.or.jp/~ohzaki/perl.htm ) →メールアドレスの正規表現 ( http://www.din.or.jp/~ohzaki/perl.htm#Mail )

関連するQ&A

  • 同一のメールアドレスの禁止設定を追加したい

    同一のメールアドレスを禁止するのを掲示板に適用させたいのですが、男性のログと女性のログがあり、どう設定していいか分かりません。男女のログファイルは階下のフォルダに入ってて、 男性 $mensfile 女性 $ladysfile とメインのCGIで設定されていす。 チャレンジしてみたら、過去のログファイルが全て消えてしまい散々な目に会いました。下のどちらかでできそうな・・宜しくお願い致します。 (1)# 二重登録のチェックをします if(-e $data){ open(FILE, "< $data"); # この時点でファイルは必ず存在します while(<FILE>){ @v = split(/\t/); if(@v[0] eq $name){ print "<center><b>すでに$nameさんは登録されています</b><br>\n"; print "「戻る」を押して入力しなおしてください</center>\n"; exit(0); } } close(FILE); } (2)#----------2重登録チェック---------- &lock; if(!open(IN,"$mail01")) {print 'ファイルOPENができませんでした。',"\n"; exit;} @dataline = <IN>; close(IN); unlink $lockfile; foreach $DATA (@dataline) { chomp $DATA; if($DATA eq $MAIL){ print 'このメールアドレスは既に登録されています。',"\n"; exit; } 宜しくお願い致します。

    • ベストアンサー
    • CGI
  • Perlを使った正規表現について

    テキストファイルを読み込んで、以下のルールに従った文字列だけを.txtで出力するプログラムを書いています。 具体的にはテキストファイル中の "text":"★★★","to_user" で囲まれている★★★の部分のみを抽出したいです。 そこで正規表現に触りだしたのですが、表現がうまくいっていないようで1週間ほどはまっています。。うまく出力できるように直しをいただけないでしょうか。 打ち明けてしまうと、★★★の部分はtwitterの呟き(日本語)になります。 以下がそのソースになります。よろしくお願いします。 print "Input file name: "; $ifname = <STDIN>; open(IN, $ifname); open(OUT, "> out.txt"); #出力ファイル while(<IN>){ if($ifname =" m/"test":(.*?),"to_user"/; next if($_ eq ""); print OUT "$_\n"; #書き出し } close(OUT); close(IN);

    • ベストアンサー
    • Perl
  • perl ファイルが開かない

    perl でファイルを開きたいのですが、なぜか開けません。何がいけないのでしょうか?エラーは、 Name "main::file" used only once: possible typo とでます。エラーを見るかぎり、コードに間違いはなく、apacheかOSに何か原因があるのではないかとおもうのですが、悩んでいます。OSはubuntuです。 #!/usr/bin/perl -w open (IN, "<test.txt") or die ("Could not open $file: $!"); while(<IN>) { print "$_"; } close (IN);

  • PHPのファイルの読み方のコード

    下記はpearlのファイルの読み込みです #!/usr/local/bin/perl print "Content-type: text/html\n"; print "\n"; require './jcode.pl'; if (!open(IN,"$userfile")) { &error("投稿データファイルを開けません"); } @DATA = <IN>; @DATA = reverse(@DATA); close(IN); foreach $line (@DATA){ ($f1,$f2,$f3) = split(/,/, $line); &jcode'convert(*line,'sjis'); push(@CS,$line); } foreach (1.. 100) { ($f1,$f2,$f3) = split(/,/, $CS[$_]); print "$f1\n"; } exit; ############################################## foreach (1.. 100) { ($f1,$f2,$f3) = split(/,/, $CS[$_]); print "$f1\n"; } この部分のPHPのコ-ド書き方をお願いします

    • ベストアンサー
    • PHP
  • cgiの投票回数制限設定について(Perl)

    投票cgiを作成していますが、以下のPerlでは、同一IPから1日1回の投票しかできません。 同一IPからの投票を1日連続5回まで許可する仕組みにしたいと考えています。(6回目以降は単にカウントされないだけで警告等は出さない) 以下のPerlをどのように改造すれば良いか具体的にアドバイスを頂けると大変助かります。 かなり専門的な内容で恐縮ですが、困っておりますので、何卒よろしくお願い致します。 m(_ _)m --------------------- # IPアドレスのチェック sub IpCheck { if (!-e $iplog) { &TimeLog; } $last = (localtime((stat($iplog))[9] + $jisa))[3]; $today = (localtime($nowtime))[3]; if ($last != $today) { unlink($iplog); &TimeLog; } open(TLOG,"<$iplog"); @IP = <TLOG>; close(TLOG); $l = 0; foreach (@IP) { $_ =~ s/\r|\n//g; if ($_ =~ /^$addr/) { &NoCnt; } elsif ($l == $#IP) { if (!open(RTIP,">>$iplog")) { &Error(4); } print RTIP "$addr\n"; close(RTIP); &CNTUP; } $l++; } } sub TimeLog { if (!open(TIME,">$iplog")) { &Error(5); } print TIME "$addr\n"; close(TIME); chmod(0666,$iplog); &CNTUP; } #------------------------------------------------- # クリックカウントアップ sub CNTUP { #ファイルロック開始 if( $lockkey ne '0' ){ &LOCK; } if (!open(IN,"$linkdata_file")) { &ERROR( read_linkdata ); } @BASE = <IN>; close(IN); foreach $data (@BASE) { #データリスト読込 &LINKDATALIST; if( $in{'targetno'} eq $CNTNUM ){ $COUNTERUP = $CLICK + 1; $targeturl = $LINKURL; $new_data = "$CNTNUM,$DATE_LINKDATA,$DATE_LMT,$DATE_ESY,$OPN,$NEWMARK,$CATEGORY,$LINKNAME,$HONORIFIC,$LINKURL,$COMMENT,$COUNTERUP,$IMAGE,\n"; }else{ $new_data = "$CNTNUM,$DATE_LINKDATA,$DATE_LMT,$DATE_ESY,$OPN,$NEWMARK,$CATEGORY,$LINKNAME,$HONORIFIC,$LINKURL,$COMMENT,$CLICK,$IMAGE,\n"; } #ファイルの最初にデータを保存する push( @TOTAL , $new_data ); } #実際にファイルに書き込む if (!open(NOTE,">$linkdata_file")) { &ERROR( read_linkdata ); } print NOTE @TOTAL; close(NOTE); #ファイルロック解除 if( $lockkey ne '0' ){ &UNLOCK; } #HTML出力 print "Location: $targeturl\n\n"; exit;

    • ベストアンサー
    • Perl
  • perlで容量の大きいCSVファイルを開く方法

    perlで容量の大きいCSVファイルを開く方法 ファイル容量の大きいcsvファイルから、必要な項目を抜き出して別ファイルにするプログラムを作成したいと思ってます。 csvファイルが少ない場合は動作したのですが、容量が140MBを超えたデータを読み込もうとすると、ブラウザー表示で何も変化いたしません プログラムは以下のようになってます。 ------------------------------------------------- 略 open(IN,"$inport") || &error(" $inport を読み込みopen出来ません"); flock(IN,1); @lines = <IN>; foreach $lines (@lines) { local(@val) = split("\,", $lines); print "$val[0]"; $dat .= "$val[1]\,$val[5]\n"; } open(OUT,">$dcsv"); flock(OUT,2); print OUT "$dat"; close OUT; 略 ------------------------------------------------- 件数も多いので、foreachを$lines (@lines) としないで($start .. $end)として読み込みの件数を制限して対応しようと考えてましたが、うまくいきませんでした。 ご指導いただけますと幸いです。

    • ベストアンサー
    • Perl
  • perl の printでのファイルへの指示にて

    独学でmacでパールを勉強しています。 始めてからまだ1週間くらい。 教科書みながら、print命令でファイルハンドルに指示を出してるのですが、 書き込めはできるのですが、 ファイルが無い場合、 新規に自動でファイルが作成されるはずとの記載があったのですが、 何故か、自動でファイルが生成されません。 調べても、設定が必要等言われてますが、 mac自体も初心者でほとんどわかりません。 どのような設定にすればいいのでしょうか? また、ソースに何か悪い所があるのでしょうか? お助けください。   ちなみに下記がソースです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>アクセスカウンタ</TITLE></HEAD>\n"; print " <BODY>\n"; print "<H1>test</H1><HR>\n"; if ( open ( FH , "count.txt")){ $cnt = <FH>; close( FH ); $cnt++; print"<CENTER>あなたは${cnt}人目の訪問者です。</CENTER>\n"; if ( open(FH, ">count.txt" )){ print FH $cnt; close(FH); } else { print "ファイルの書き込みオープンに失敗しました。\n"; } } else { print "ファイルの書き込みオープンに失敗しました。\n"; } print "</BODY>\n"; print "</HTML>\n"; __END__ ーーーーーーーーーーーーーーーーーーーーーーーーーー

    • ベストアンサー
    • Perl
  • perl 計算結果をファイルへ出力したい

    perl やり始めたばかりです。宜しくお願いします。 入力ファイル data.txt があるとします。 data.txt は、 123 456 789 333 555 777 以上のようなテキストファイルといたします。このファイルを 以下の様に100分の1にして出力したい。 1.23 4.56 7.89 3.33 5.55 7.77 と言うことで、この場で教えていただきました。それが、以下です。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); foreach $line (@x){ chomp($line); @elms = split(' ',$line); foreach $data (@elms){ print $data/100," "; } print "\n"; } おかげ様でこれはこれで上手く動きました。そこで、出力値をファイルに 書き込みたいのです。 もちろん、以下の様な方法でファイルに 書き込めるのは判っております。 計算プログラム.pl > outfile.txt しかし、上のプログラムをベースにファイルに書き込めないかと色々と 試してはみましたが、どうも上手く行きません。 どなたか教えて頂けないでしょうか? 宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • perlでファイルへの書き込みができません!

    perlでファイルへの書き込みができません! 教えてください. webプログラミング初心者なのですが, フォームから送信されたデータをshift-jisに変換させてからbbs1.txtへの内容の書き出しを行いたいのですが, #!/Applications/XAMPP/xamppfiles/bin/perl print "Content-type: text/html; charset=utf-8\n\n"; # フォーム部分を表示する print <<EOL; <html> <body> <h2>一行掲示板</h2> <form method="post" action="bbs1.cgi"> メッセージ:<input type="text" name="message" size="60"> <input type="submit" value="送信"> </form> <hr> EOL &ReadParse(*form); # フォームの値を取得 $message = $form{"message"}; use Encode; use Encode::Guess qw(euc-jp shiftjis 7bit-jis); encode("shiftjis",decode('Guess',$message)); # ログファイル読み込み open(IN, "bbs1.txt"); @log = <IN>; close(IN); # メッセージが入力されているときは書き込み処理を行なう if ($message ne "") { # ログ先頭にメッセージを格納 unshift @log, "$message\n"; # ログファイルに書き込み open(OUT, "> bbs1.txt"); print OUT @log; close(OUT); } # ログ表示 foreach $data (@log) { chop $data; print "$data<br>\n"; } print "</body>\n</html>\n"; このような感じにし実行して後でtxtファイルを見ると何も書かれていません>< なぜでしょうか...? 教えて下さい>< 今気づいたのですがそれに関連してなのかログも表示されていませんでした...>< txtファイルのアクセス権は読み書き可になっています encodeはあえてつかっています.

    • ベストアンサー
    • Perl
  • メール送信のFromアドレスについて

    始めまして。 taki2といいます。 Perlのメール送信で使用するFromアドレスで分からない 事がありますので、アドバイスをよろしくお願いします。 -内容- Fromをtaki@xxx.comと設定してメールを送信した場合、実際届くメールのFromには taki@xxx.com と、表示されます。 しかし、Fromを"taki@xxx.com"と設定した場合 実際届くメールのFromは "taki@xxx.com"@xxx.com と、表示されます。 ""をつけるとどうやら""の中がアカウントと認識されるみたいです。 これを""があっても@xxx.comを設定せずにしたいのですが、どうすればよいのでしょうか? ちなみにメール送信しているプログラムは以下の通りです。 sub MailSend {  my $head = $_[0];  my $body = $_[1];  my $flgMime = $_[2]; #エンコード判定フラグ my $in_return = 0; my $rc;  #メールコマンド  my $cmdMail = "/usr/lib/sendmail -t";  #文字コード変換  ##件名  &Jcode::convert( $$head{ "SUBJECT" }, "jis" ); ##本文 foreach( @{$body} ){ &Jcode::convert( $_, "jis" ) }; #ヘッダのMIMEエンコード if( $flgMime ){ $$head{ "SUBJECT" } = MIME::mimeencode($$head{ "SUBJECT" }); } #メール送信 $rc = open( OUTMAIL, "| $cmdMail" ) ; if($rc) { print OUTMAIL "From: $$head{ "FROM" }\n"; print OUTMAIL "To: $$head{ "TO" }\n"; print OUTMAIL "Cc: $$head{ "CC" }\n"; print OUTMAIL "Bcc: $$head{ "BCC" }\n"; print OUTMAIL "Subject: $$head{ "SUBJECT" }\n"; print OUTMAIL "\n"; foreach( @{$body} ){ print OUTMAIL $_."\n" }; print OUTMAIL ".\n"; close( OUTMAIL ); } else{ $in_return = 1; } return $in_return; }

    • ベストアンサー
    • Perl