我有一个perl脚本,它使用system()
调用其他perl脚本就像:
my $returnval= system("perl", $path,$val1, $val2,@myarray);
因为system()只返回退出状态,但我想要脚本的输出,我想使用反引号。
我尝试过类似的东西:
my $returnval = `$path`;
如何添加脚本应该接收的参数?
其他perl脚本的返回代码怎么样?目前就像是
exit ($myreturnedvalue);
(how)是否可以返回多个值?
答案 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::Simple的capturex
。
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命令。