perl - 使用反引号代替系统()

时间:2012-06-03 13:05:53

标签: perl system return-value backticks

我有一个perl脚本,它使用system()

调用其他perl脚本

就像:

my $returnval= system("perl", $path,$val1, $val2,@myarray);

因为system()只返回退出状态,但我想要脚本的输出,我想使用反引号。

我尝试过类似的东西:

my $returnval = `$path`;

如何添加脚本应该接收的参数?

其他perl脚本的返回代码怎么样?目前就像是

exit ($myreturnedvalue);

(how)是否可以返回多个值?

5 个答案:

答案 0 :(得分:5)

通过shell来将数据从一个perl脚本移动到另一个脚本并不是最好的解决方案。您应该知道反引号或qx()捕获打印到STDOUT的任何内容。使用其他脚本中的exit ($var)不太可能被正确捕获。您需要print $var。但不要这样做。

相反,将另一个脚本放入模块并直接使用子例程。这是一个简单的例子:

在bar.pm:

use strict;
use warnings;

package bar;  # declare our package

sub fooz {             # <--- Our target subroutine
    my $in = shift;    # passing the input
    return $in * 5;    # return value
}
1; # return value must be true

在main.pl中:

use strict;
use warnings;
use bar;   # bar.pm must be in one path in @INC

my $foo = bar::fooz(12);  # calling fooz from our other perl script
print "Foo is $foo\n";

还有很多东西需要学习,我建议你阅读documentation.

答案 1 :(得分:3)

反引号的工作方式就像在shell中直接调用一样:

you@somewhere:~$ ./script.pl --key=value

基本相同
my $returnval = `./script.pl --key=value`;

答案 2 :(得分:3)

您需要IPC::System::Simplecapturex

use IPC::System::Simple qw( capturex );
my $output = capturex("perl", $path, $val1, $val2, @myarray);

它甚至可以为您处理错误。

答案 3 :(得分:2)

为了同时调用传递参数和捕获输出的其他程序,我是IPC::Run的忠实粉丝:

use IPC::Run 'run';

my $exitcode = run [ $command, @args ], ">", \my $output;

# $exitcode contains the exit status and
# $output contains the command's STDOUT data

答案 4 :(得分:1)

这不符合您的要求吗?

my $returnval = `$path $val1 $val2 @myarray`;
然而,@ Quentin添加了这个有用的建议:如果你要传递的值是foo "bar,那么在shell中你必须做"foo \"bar"之类的事情。使用系统的额外参数将为您带来卡片。使用反引号不会;你需要手动构建你想要的shell命令。