0

我在 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

我怎么能做到这一点?请帮帮我,我在 Google 中搜索过,但我一无所获。

4

2 回答 2

4

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

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

你可能需要的是反引号

`$exe @parm`

或者,更清楚地说,

qx{$exe @parm}

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

请注意,您可能需要注意 and 的内容$exe@parm因为生成的字符串必须在命令行中有效,并且字段可能需要适当地引用或转义。

更新

再次查看您的代码,似乎您可能期望system. 但是把它变成一个数组,遍历数组,提取非空白元素是非常复杂的!$?结果与您添加到返回数组中的值相同。

要转移程序的输出,您需要从命令外壳而不是直接运行它,因此要将输出发送到 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;
于 2013-02-27T12:51:57.150 回答
1

我今天刚刚遇到了同样的问题,并记得我在很多很多脑细胞之前就找到了解决方案(大约 4 年前的脑细胞价值)。在搜索了我的旧代码之后,我找到了解决方案。这里是。只需将您的系统调用放在反引号内,并附加“2>&1”。这是一个例子。

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

系统调用的结果分配给 $results,而不是打印出来。我不记得确切的原因或方式,但确实如此。

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

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

于 2015-01-24T02:14:18.563 回答