- ベストアンサー
CGIでのgrep関数においての質問
Perl言語で作成するCGIプログラムについての質問なのですが、grep関数をつかって文字のマッチングを試みて、1回目はうまくいったのですが、同じように2回目を同じプログラムで使ったところ、絶対に0件マッチになります。検索対象も、検索文字列も、スカラー変数でだしてみて目で確認して明らかに合致しているのに0件になります。 ちなみに、使用した関数は以下のような感じです。 @hit = grep(/$data1/,@data2); $hit = grep(/$data1/,@data2); $hitでだしてみても0になりますし、@hitも何も入っていません。 grep関数は2回使えないのでしょうか。 検索文字はメールアドレスなのですが、前のプログラムで同じように関数を使って成功していますので、検索文字が原因ではないと思いますが。 ご回答お願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
検索パターンの方をファイルから読み込んでいるのですね。 では、こちらの改行コードが問題になります。 $mailaddress = <FILE>; chomp $mailaddress; ファイルから読み込んだら、行末の改行コードも含まれますので、 不要な場合は削除して下さい。 ----------------------------------------------------------- >1. $mailaddress = "abcde@fghijk.com"; >2. $mailaddress = "abcde\@fghijk.com"; ダブルクオートで囲った文字列は変数が展開されます。 1は @fghijk の部分が変数名と誤解されてますね。 2の様にエスケープするか、シングルクオートで囲えば問題ないはずです。 $mailaddress = 'abcde@fghijk.com'; ファイルから読み込んだ場合は、変数は展開されませんので、 問題ないはずです。 また、@ は正規表現内ではエスケープ不要です。 ----------------------------------------------------------- しかし、メールアドレスに使われるピリオドは問題です。 これは正規表現では特別な意味を持ちますので、 エスケープする必要があります。 念のためピリオド以外もエスケープして、 下記のような感じでどうでしょう? $mailaddress = <FILE>; chomp $mailaddress; $mailaddress =~ s/([\$\(\)\*\+\.\?\[\\\]\^\{\|\}])/\\$1/g; @hit = grep(/$mailaddress/,@data);
その他の回答 (2)
- venzou
- ベストアンサー率71% (311/435)
>grep関数は2回使えないのでしょうか。 回答出てますが、何度でも使えるはずです。 原因は他の所にあると思います。 --------------------------------------------------- $data1、@data2の具体的な内容が分からないと、 何とも言えませんが、よくある失敗は改行コードかな。 これは目で確認しても気付き難いです。 grepの前で、改行コードを消してみて下さい。 chomp @data2; --------------------------------------------------- 上記で解決しない場合・・・ >前のプログラムで同じように関数を使って成功していますので、検索文字が原因ではないと思いますが。 書いた本人には、そういう思い込みがあります・・・ 他人の目で見ると、簡単に原因が見付かる場合もありますよ。 出来れば、具体的なデータを補足して下さい・・・と、言いたい所ですが、 メールアドレスなら、生のデータは書けませんね。(^^; 架空のアドレスで、不具合の出るデータは作れませんか?
お礼
chomp関数をつかってもヒットしませんでした。 しかし、アドレスをログからファイル操作で読み込んで変数に代入していたのですが、変数を直接指定してやると、 ($mailaddressは$data1の部分で検索文字です) 1. $mailaddress = "abcde@fghijk.com"; 2. $mailaddress = "abcde\@fghijk.com"; 1だと$mailaddressは abcde.com になり、2は abcde@fghijk.com になり、2はヒットしました。 しかし、ファイル操作で読み込むため、 $mailaddress = <FILE>; となり、@をエスケープできません。 もし、ヒットしない理由が上の$mailaddressが要エスケープでヒットしないなら、エスケープする方法はあるんでしょうか?
- osamuy
- ベストアンサー率42% (1231/2878)
> grep関数は2回使えないのでしょうか。 使えますよ。以下は検証コード: use Data::Dumper; $d = 'a'; @d = qw( abc def zax ); print "[1]\n", Dumper( grep( /$d/, @d ) ), "\n"; print "[2]\n", Dumper( grep( /$d/, @d ) ), "\n";
お礼
ご回答ありがとうございます。 Dumper関数で検証してみたのですが、やはり何も表示されませんでした。 [1] [2] というかんじで。
お礼
chomp関数で検索文字$mailaddressの改行文字を切り落とすことで解決できました。 ご指摘通り、改行文字が邪魔になっていたようです。 ご丁寧にありがとうございました。