Perl - 使用反引用缺少输出

时间:2012-04-06 07:07:52

标签: perl stdout capture

大家好我需要捕获外部命令的输出,因此我使用反引号。 但是,当命令到达换行符时,将省略输出。其中$ _ = AD

@lines = `"C:/Program Files/Veritas/NetBackup/bin/admincmd/bppllist" $_ -U"`
Test: test1
Test: test2

Test: test3
Test: test4

实际输出: @lines

Test: test1
Test: test2

感谢您的时间。

    print HTML "<h2 id='pol'>Policy Configuration\n</h2>" ;

  @bpllist =`"$admincmd/bppllist.exe"` or die print "$admincmd/bppllist.exe not found or could not be executed";
foreach (@bpllist) 
{
  print HTML "<div><table class='table'>\n";
  @lines = `"$admincmd/bppllist" $_ -U` or die print       "$admincmd/bpplinfo $_ -U not found or could not be executed";
   print HTML "\t<tr>\n\t<td><b>Policy name: <b></td><td>$_</td>\n\t</tr>\n" ;

  foreach (@lines) {

chop;
 ($var, $value) = split(/:/,$_,2);
 $var = "" if !defined($var);
 $value = "" if !defined($value);
print HTML "\t<tr>\n\t<td>$var</td><td>$value</td>\n\t</tr>\n" ;

  } 
  print HTML "</table></div>";
  }

@bpllist的输出:

  AD
  Sharepoint
  Echchange
  Vmware

3 个答案:

答案 0 :(得分:1)

以下是如何捕捉STDOUT&amp;使用反引号生成进程的STDERR:

my $output = join('', `command arg1 arg2 arg3 2>&1`);

它的工作原理对command的输出中的换行没有任何依赖。

如果您还需要向command的STDIN发送文本,请使用IPC :: Open3。


稍微清理你的代码。它对我有用。

use strict;
use warnings;
use 5.10.0;

# something missing here to set up HTML file handle
# something missing here to set up $admincmd

print HTML q{<h2 id='pol'>Policy Configuration\n</h2>};
my @bpllist = `"$admincmd/bppllist.exe"` 
  or die "$admincmd/bppllist.exe not found or could not be executed\n";
for my $policy (@bpllist) {
  print HTML q{<div><table class='table'>\n};
  my @lines = `$admincmd/bpplinfo.exe $policy -U 2>&1`;
  print HTML qq{\t<tr>\n\t<td><b>Policy name: <b></td><td>$policy</td>\n\t</tr>\n} ;
  for my $pair (@lines) {
    chomp($pair); # only remove newlines, not other characters
    my ($var, $value) = split /:/, $pair, 2;
    $var //= '';
    $value //= '';
    print HTML qq{\t<tr>\n\t<td>$var</td><td>$value</td>\n\t</tr>\n} ;
  }
  print HTML q{</table></div>};
}

更新2

您似乎在Windows上执行此操作?

我不认为2>&1技巧会在那里发挥作用。

答案 1 :(得分:1)

不要使用qx或反引号然后使用shell命令来重定向输出,而是尝试使用核心模块IPC::Cmd。特别是,它的可导出函数&run将方便地为您捕获STDOUT和STDERR。从概要:

### in list context ###
my( $success, $error_message, $full_buf, $stdout_buf, $stderr_buf ) =
run( command => $cmd, verbose => 0 );

答案 2 :(得分:0)

也许命令将其输出发送到stderr。

试试这个:

my $output = `'command' -ARG -L 2>&1`;

的问候,