perl - "tee"qx 运算符

标签 perl redirect

我正在编写一个脚本,目前有:

my @files = `$some_command`;
print @files;
chomp @files;
foreach my $file (@files)
{
    process($file);
}

它工作正常,但 some_command 部分占用了脚本的大部分时间。在那段时间里,stdout 上什么也没有出现,因为 Perl 已经重定向了 some_command 的输出来填充 @files 数组。只有在 some_command 完成并且 Perl 继续执行 print @files; 时才会打印它。

是否有一些巧妙的方法可以更改此代码,以便 some_command 的输出在执行时出现?我也许可以使用 tee(1) 尝试这样的事情:

my $tmpfile = File::Temp->new();
system("$some_command | tee " . $tmpfile->filename);
my @files;
{ local $/ = undef; @files = split /\s/, <$tmpfile>; }

但如果有更简单的解决方案,我宁愿避免使用临时文件。

最佳答案

您可以在打印行的同时自己打开句柄并手动填充数组。

这样的事情可能会奏效,

  open my $fh, '-|', $some_command;
  while(<$fh>)
  {
    print $_;
    push @files, $_;
  }
  close $fh;

关于perl - "tee"qx 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032352/

相关文章:

perl - 如何安全地将带空格的文件名传递给 Perl 中的外部命令?

perl - 为什么 Perl 的严格模式允许您在此 foreach 上下文中而不是赋值上下文中取消引用具有未定义值的变量?

mod-rewrite - 使用 mod_rewrite 强制 SSL/HTTPS

wordpress - 网站链接的重定向/安全问题

.htaccess - Google 搜索结果中的链接未按照 .htaccess 重定向到预期页面

asp.net - 重定向到 returnUrl 在 Asp.Net MVC5 中如何工作

用于从文件中替换换行符的 ruby​​ 等效 perl 命令?

Perl:以 "perl' ish"方式进行值映射

sorting - 在 Perl 版本 5.20 中从具有可选排序的 sub 返回 arrayref 的适当方法

python脚本,输出重定向信号,将浏览器指向目标登陆页面