2012-06-03 49 views
4

我有,通过使用系统()perl的 - 用反引号代替系统()

它就像调用一个其它的Perl脚本perl脚本:

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

由于系统()只返回退出状态,但我想要脚本的输出我想使用反引号。

我想类似的东西:

my $returnval = `$path`; 

如何添加脚本应该得到的参数?

其他perl脚本的返回代码应该如何显示?目前它就像

exit ($myreturnedvalue); 

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

+0

遗憾的是,我不明白关于返回多个值的问题。你能澄清吗? – thb

+0

我想用参数调用一个脚本,然后我想要脚本的输出和这个输出,它必须是单个值还是可以是一个数组或两个参数如exit(x1,x2) – Tyzak

+0

您只能返回一个一段文字(或二进制数据)。如果你想要多个值,那么你正在调用的脚本需要返回你在Perl中解析的序列化数据结构(空格分隔,JSON,XML等)。 – Quentin

回答

5

要经过外壳,以便从一个移动数据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

这不是你想要的吗?然而

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

@Quentin增加了这个有用的建议:如果你想传递的价值foo "bar然后在外壳里,你将不得不做一些像"foo \"bar"。对系统使用额外的参数将为您带来该卡。使用反引号不会;你需要手动构建你想要的shell命令。

+0

它不会自动引用/转义参数 – Quentin

+0

@Quentin:感谢您的建议。我承认我不知道自动引用是什么。通过我的Perl手册中的快速grep发现了三个神秘的,传递给“自动引用”或“自动引用”的引用,但这些不能解释;网络搜索也不会立即提供任何非常有用的信息。如果你能抽出一点时间,你会进一步解释一下吗?谢谢。 – thb

+0

我试过了,之后我尝试了'$ path/$ val1/$ val2/@ myarray',两者都不起作用:> – Tyzak

3

的反引号只是像一个直接调用一个会使得在shell工作:

[email protected]:~$ ./script.pl --key=value 

是基本相同

my $returnval = `./script.pl --key=value`; 
+0

--key = value是什么意思? – Tyzak

+0

这只是一个传递参数的例子。将其替换为适用于您的脚本的任何内容;基本上是'$ val1 $ val2' ... – mjhennig

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 
+0

IPC :: Cmd代替'IPC :: Run',提供类似的功能并且是核心模块。 – Eponymous

3

你想要IPC::System::Simplecapturex

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

它甚至为您处理错误。

+1

为什么-1? OP询问了一个反引号的版本,该命令不受shell解释的限制,这就是'capturex'的含义。 – ikegami