4

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

就像是:

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

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

我尝试过这样的事情:

my $returnval = `$path`;

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

其他 perl 脚本的返回码应该是怎样的?此刻就像

exit ($myreturnedvalue);

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

4

5 回答 5

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";

还有很多东西要学,我建议你阅读文档。

于 2012-06-03T13:45:05.523 回答
4

你想要IPC::System::Simplecapturex.

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

它甚至为您处理错误。

于 2012-06-03T20:27:48.743 回答
3

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

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

基本上是一样的

my $returnval = `./script.pl --key=value`;
于 2012-06-03T13:13:45.267 回答
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
于 2012-06-03T14:20:56.890 回答
1

这不是你想要的吗?

my $returnval = `$path $val1 $val2 @myarray`;

但是@Quentin 添加了这个有用的建议:如果您要传递的值foo "bar在 shell 中,则您必须执行类似"foo \"bar". 对 system 使用额外的参数将为您解决问题。使用反引号不会;您需要手动构建所需的 shell 命令。

于 2012-06-03T13:11:57.177 回答