perlのgrep
2つのテキストファイルA,Bがあり、それぞれのファイルには1行に1件名前がリストされています。Aにはあるが、Bにはない名前を探すためにこんなperlのスクリプトを書いたのですが、うまく動作しませんでした。
#!/usr/bin/perl open(HOGE,"< ./a"); @fuga = <HOGE> ; close(HOGE); while(<>){ chop ; print $_,"done\n" if (grep(/$_/,@fuga) ; }
こう書いて、
$ ./hoge.pl ./b
と実行すると、bに含まれている文字列がなぜだか全部マッチする。なぜだろうとperlのgrepのヘルプをよく読むと、第二引数に指定されたリストの要素を一つずつ$_に展開してから第一引数に指定された正規表現とマッチさせているとのこと。
つまり上記コードだと、同じものを比較しているので当然全部マッチするんですな。よって、bを展開するループでは$_を使わないで、別の変数をあてるといい。修正後のスクリプトはこう。
#!/usr/bin/perl open(HOGE," < ./a" ); @fuga=<HOGE> ; close(HOGE); foreach $name(<>){ print $name,"done\n" if (grep(/$name/,@fuga) ; }