zcat 在命令行中工作但不在 perl 脚本中工作
zcat working in command line but not in perl script
这是我的脚本的一部分:
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
匹配。
谁能告诉我为什么?
你的问题让我们猜测很多事情,但更好的整体方法似乎是只打开文件一次,然后在 Perl 本身中处理每一行。
open(F, "zcat $file_list |") or die "[=10=]: 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 元字符,这导致它在 shell 之前被处理grep
运行。
总是最好使用 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
}
这是我的脚本的一部分:
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
匹配。
谁能告诉我为什么?
你的问题让我们猜测很多事情,但更好的整体方法似乎是只打开文件一次,然后在 Perl 本身中处理每一行。
open(F, "zcat $file_list |") or die "[=10=]: 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 元字符,这导致它在 shell 之前被处理grep
运行。
总是最好使用 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
}