0

これが私のスクリプトの一部です:

foreach $i ( @contact_list ) {

    print "$i\n";

    $e = "zcat $file_list2| grep $i";
    print "$e\n";

    $f = qx($e);
    print "$f";                                       
}

$eは正しく印刷されますが、 に一致する$f場合でも空白行が表示されます。$file_list2$i

誰でも理由を教えてもらえますか?

4

2 に答える 2

0

pipe を使用する代わりに、常に Perl の grep を使用することをお勧めします。

@lines = `zcat $file_list2`;    # move output of zcat to array
die('zcat error') if ($?);      # will exit script with error if zcat is problem
# chomp(@lines)                 # this will remove "\n" from each line

foreach $i ( @contact_list ) {

    print "$i\n";

    @ar = grep (/$i/, @lines);
    print @ar;
#   print join("\n",@ar)."\n";      # in case of using chomp
}

最善の解決策は、zcat を呼び出すのではなく、zlib ライブラリを使用することです: http://perldoc.perl.org/IO/Zlib.html

use IO::Zlib;

# ....
# place your defiiniton of $file_list2 and @contact list here.
# ...

$fh = new IO::Zlib; $fh->open($file_list2, "rb")
    or die("Cannot open $file_list2");
@lines = <$fh>;
$fh->close;

#chomp(@lines);                    #remove "\n" symbols from lines
foreach $i ( @contact_list ) {

    print "$i\n";
    @ar = grep (/$i/, @lines);
    print (@ar);
#   print join("\n",@ar)."\n";    #in case of using chomp
}
于 2016-09-27T11:40:29.697 に答える
0

あなたの質問から多くのことを推測できますが、より良い全体的なアプローチは、ファイルを 1 回だけ開き、Perl 自体で各行を処理することです。

open(F, "zcat $file_list |") or die "$0: could not zcat: $!\n";
LINE:
while (<F>) {
    ######## FIXME: this could be optimized a great deal still
    foreach my $i (@contact_list) {
        if (m/$i/) {
            print $_;
            next LINE;
        }
    }
}
close (F);

内側のループからさらに絞り出したい場合は@contact_list、ループの前に正規表現を別の配列にコンパイルするか、それらの 1 つが一致するかどうかだけを気にする場合は、それらを 1 つの正規表現に結合します。一方、1 つのパターンのすべての一致を最後にのみ印刷したい場合は、検索式ごとに一致を 1 つの配列に収集し、それらをループして、入力のセット全体を grep したときに印刷します。ファイル。

の内容に関する情報がないと問題を再現できません$iが、実行前にシェルによって処理されるシェルメタキャラクターが含まれていると推測できますgrep

于 2016-09-26T11:14:54.537 に答える