WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:Perlのgrep関数で

0:[投稿] あやの [2002/09/10 17:48 ][環境:WIN+IE UNIX系+Perl]

Perlにあるgrep関数を使用して、下記のようなプログラムを作成したのですが、期待する動きをしてくれません。

@hoge = ('aaa','bbb','ccc');
@foo = ('bb','xx');

foreach (@foo){
 print "$_=>";
 if(grep(/\Q$_\E/, @hoge)){
   print "OK\n";
 }else{
   print "NG\n";
 }
}

期待する実行結果
bb=>OK
xx=>NG

しかし、このソースだとどちらもOKになってしまいます。
どうかよろしくおねがいします。


1:[回答] ふじ [URL] [2002/09/10 18:07 ]

$_ を使わないで、変数に名前をつけましょう。

foreach $f(@foo){
print "$f=>";
if(grep(/\Q$f\E/, @hoge)){
  print "OK\n";
}else{
  print "NG\n";
}
}


perldoc -f grep してみると理由が書いてあります。
簡単にいうと、

grep EXPR, LIST

として実行した場合、grep は LIST の値を一つづつ $_ に代入して
EXPR を評価します。
EXPR に /\Q$f\E/ とだけ書けば、暗黙のうちに $_ に対する
パターンマッチとして処理されるので便利。


2:[回答] やじうま1号 [2002/09/10 18:08 ]

grep関数内で行いたいことがわかりません。

\Qは以降のメタ文字をクオートする働きがあり、bbもxxも変わらない気がします。


3:[回答] ふじ [URL] [2002/09/10 18:13 ]

> \Qは以降のメタ文字をクオートする働きがあり、bbもxxも変わらない気がします。
変数は展開されますよ。
変数内に含まれるメタ文字が無効化されます。


4:[回答] やじうま1号 [2002/09/10 18:25 ]

>>3
そうですね。。。 訂正します。
ところで、ふじさんのサイトへのリンクが多分これはなにやらのモデムに繋がるような認証を求められるのですが。


5:[回答] ふじ [URL] [2002/09/10 18:48 ]

本題から外れます。すみません。
>>4
> モデムに繋がるような認証を求められるのですが。
DynDNS (http://www.dyndns.org/) のダイナミックDNSサービスを
利用しているので、接続が切れて IP アドレスが変わった直後には
DNS 情報が古くて、他の人のアドレスを引いてしまう場合があります。
# つまり、他の人のADSLルータにつながってしまうという。
# 恐ろしいことに、デフォルトで外側の80番が空いているのですよ。
# 某ADSLの指定品ルータだと。

ちょっと時間をあけてアクセスすれば大丈夫だと思います。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World