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

如何在Perl中使用系统调用而不打印结果/输出文本?,perl,system,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 { pr

我正在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):


我怎样才能做到这一点?请帮帮我,我在谷歌上搜索过,但什么也没找到。

你在你的程序中使用了
system
,它可以让你正在运行的程序打印到标准输出,并返回程序的退出状态(一个数字)

因此,您目前拥有的没有任何意义,因为
@output
将只包含一个数字,并且您无法将其解析为正在运行的程序的输出

你可能需要的是回执

`$exe @parm`
或者,更清楚地说

qx{$exe @parm}
这将返回程序的输出,正如您所期望的那样,并避免将其打印到标准输出

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

更新

再次查看您的代码,您可能希望看到
系统的退出状态。但是把它放在一个数组中,在数组上循环,提取非空白元素是非常复杂的!结果与添加到返回数组中的
$?
值相同

要转移程序的输出,您需要从命令shell而不是直接运行它,因此要将输出发送到Windows nul设备,您的代码如下所示

system('cmd /C', $exe, @parm, '>nul');
return $? >> 8;
实际上,您也可以删除子例程并更改行

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


您已经在程序中使用了
system
,它可以让正在运行的程序打印到标准输出,并返回程序的退出状态(一个数字)

因此,您目前拥有的没有任何意义,因为
@output
将只包含一个数字,并且您无法将其解析为正在运行的程序的输出

你可能需要的是回执

`$exe @parm`
或者,更清楚地说

qx{$exe @parm}
这将返回程序的输出,正如您所期望的那样,并避免将其打印到标准输出

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

更新

再次查看您的代码,您可能希望看到
系统的退出状态。但是把它放在一个数组中,在数组上循环,提取非空白元素是非常复杂的!结果与添加到返回数组中的
$?
值相同

要转移程序的输出,您需要从命令shell而不是直接运行它,因此要将输出发送到Windows nul设备,您的代码如下所示

system('cmd /C', $exe, @parm, '>nul');
return $? >> 8;
实际上,您也可以删除子例程并更改行

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


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

my$results=
nslookup-type=ns stackoverflow.com 2>&1

系统调用的结果将分配给$results,而不会打印。我记不清确切的原因和方式,但确实如此

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


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

我今天遇到了同样的问题,我记得我在很多很多脑细胞(大约4年前的脑细胞)之前找到了解决方案。在花了很长时间搜索我的旧代码后,我找到了解决方案。给你。只需将您的系统调用放在返回标记内,并附加“2>&1”。这里有一个例子

my$results=
nslookup-type=ns stackoverflow.com 2>&1

系统调用的结果将分配给$results,而不会打印。我记不清确切的原因和方式,但确实如此

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


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

我已经试过了,但是程序有一个错误。如果它是$exe或@parm,我真的不知道哪个是错的。我已经写了一个更新,它保留了单独的参数。那应该对你有用。如果要诊断
qx
版本,请运行
print“$exe@parm\n”
,以便查看正在生成的命令行。如果您仍然看不到错误,请将其发布到这里。顺便说一句,我忘了包括,我正在使用cygwin perl。这有关系吗?我有一个错误-无法执行“cmd/C”:没有这样的文件或目录。@quinekxi:这似乎很重要,但这意味着
cmd.exe
不在路径上。如果在命令提示下键入
cmd
,是否有效?你从哪个命令中得到了什么?该位置在命令提示符下的路径?cmd中有效。当我将你的代码与'>nul'一起使用时,它可以工作,但当我包含'>nul'时,$exe在返回代码中有一个错误:101。我有