2016-09-26 69 views
0

在这里工作是我的脚本的一部分:ZCAT在命令行,但不是在perl脚本

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匹配一个空行。

有谁能告诉我为什么?

+0

那编辑总结应该阅读“将代码添加到答案时请注意减价”。另外,欢迎来到Stack Overflow。 – simbabque

+1

什么是变数?你为什么不使用'zgrep'? – tripleee

+0

如果输入数据很大(如压缩格式所示),那么一次完成所有匹配似乎是一个更好的方法。 – tripleee

回答

0

始终是更好地使用,而不是使用管道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 
} 
0

你的问题让我们猜测许多事情,但更好的整体方法似乎只打开一次文件,并在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的正则表达式为循环之前一个单独的数组,或者将它们组合成一个单一的正则表达式,如果所有你关心的是,是否其中之一匹配。另一方面,如果您希望只在最后知道它们是什么时才打印一个模式的所有匹配项,请将匹配项按每个搜索表达式收集到一个数组中,然后将它们循环并在您清理整组输入时进行打印文件。

如果没有关于$i中的内容的信息,您的问题是无法重现的,但我可以猜测它包含一些shell元字符,导致它在运行grep之前由shell处理。

+0

@contact_list是一个拥有355k邮件ID的数组,我需要检查这些邮件ID是否存在于我的数据库中,该数据库位于zip文件中。 所以我需要检查这些355k邮件ID中是​​否存在不在zip文件中的每一个。此外,zip文件本身有400万条记录,因此我试图避免打开它并使用zcat或zgrep –

+0

是的,因此循环搜索355k次的机会将比循环整个输入文件355k次快得多。 – tripleee

+0

这不回答这个问题,几乎肯定不能解决问题。 – darch

相关问题