如何在不打印结果/输出文本的情况下在Perl中使用系统调用?

时间:2013-02-27 12:40:23

标签: perl system

我在Windows XP上使用Cygwin Perl。

我有这个代码可以运行第三方程序。

sub main {
    print("Start Running\n");
    @return = run_exe($execApp, $parm1, $parm2);
    my $returncode = pop @return;
    if ($returncode == 0) {
        print("Success\n");
    }
    else {
        print("Error\n");
    }
}

sub run_exe {
    my ($exe, @parm) = @_;
    my (@output, @return_output);

    @output = system($exe, @parm);

    foreach (@output) {
        next if !/\S/;       # white space line
        s/^(\s*)//g;         # trim from the front for $_
        s/(\s*)$//g;         # trim from the end for $_
        push (@return_output, $_);
    }

    push (@return_output, $?>>8);
    @output = ();

    return (@return_output);
}

如果成功,则会打印:

Start Running
Return Code: 0
Success

我想要的是不打印运行run_exe子程序的输出(即返回代码:0):

Start Running
Success

我怎么能实现这个目标?请帮助我,我在谷歌搜索但我什么也没找到。

2 个答案:

答案 0 :(得分:4)

您在程序中使用了system,这使您正在运行的程序打印到STDOUT并返回程序的退出状态(一个数字)。

所以你目前所拥有的内容毫无意义,因为@output只包含一个数字,你无法将其解析为正在运行的程序的输出。

你可能需要的是反叛

`$exe @parm`

或者更清楚地说,

qx{$exe @parm}

返回程序的输出,正如您所期待的那样,并避免将其打印到STDOUT。

请注意,您可能需要注意$exe@parm的内容,因为结果字符串必须在命令行有效,并且字段可能需要适当引用或转义。< / p>

<强>更新

再次查看您的代码,似乎可能期待system的退出状态。但是把它放在一个数组中,循环遍历数组,并提取非空白元素非常错综复杂!结果与您添加到返回数组的$?值相同。

要转移程序的输出,您需要从命令shell而不是直接运行它,所以要将输出发送到Windows nul设备,您的代码看起来像

system('cmd /C', $exe, @parm, '>nul');
return $? >> 8;

实际上你也可以删除子程序并改变行

@return = run_exe($execApp,$parm1,$parm2);
my $returncode = pop @return;

system('cmd /C', $execApp, $parm1, $parm2, '>nul');
my $returncode = $? >> 8;

答案 1 :(得分:1)

我今天遇到了同样的问题并且记得我在很多很多脑细胞之前找到了解决方案(大约4年前脑细胞的价值)。在花了很长时间搜索我的旧代码之后,我找到了解决方案。这里是。只需将系统调用放在后面的滴答声中,然后附加“2&gt;&amp; 1”。这是一个例子。

我的$ results = nslookup -type=ns stackoverflow.com 2>&1;

系统调用的结果将分配给$ results,而不会打印。我不记得究竟为什么或如何,但确实如此。

这对我很重要,因为我经常在PERL编辑器中运行脚本,如果我允许大量打印(即,如果上面的命令重复了数千次),它将使用很多系统内存,最终是所有系统内存。

我知道这是一个古老的话题,但希望它对下一个可怜的,不幸的灵魂疯狂地搜索问题的解决方案很有价值,就像我今晚一样。