如何将参数从一个Perl脚本传递给另一个?

时间:2009-05-27 14:11:55

标签: perl command-line parameters

我有一个运行的脚本,运行后它有一些信息需要传递给下一个要运行的脚本。

Unix / DOS命令是这样的:

perl -x -s param_send.pl
perl -x -s param_receive.pl

param_send.pl是:

# Send param

my $send_var = "This is a variable in param_send.pl...\n";
$ARGV[0] = $send_var;
print "Argument: $ARGV[0]\n";

param_receive.pl是:

# Receive param

my $receive_var = $ARGV[0];
print "Parameter received: $receive_var";

但没有打印出来。我知道我做错了但是从教程中我无法弄清楚如何将一个参数从一个脚本传递给下一个脚本!

非常感谢提前。

5 个答案:

答案 0 :(得分:8)

您可以在命令行上使用管道符来将第一个程序的stdout连接到第二个程序的stdin,然后您可以将其写入(使用print)或读取(使用{{1 }} operator}。

<>

如果您希望第一个命令的输出是第二个命令的参数,则可以使用xargs:

perl param_send.pl | perl param_receive.pl

答案 1 :(得分:2)

@ARGV在运行时创建,不会持久存在。因此,您的第二个脚本将无法在第一个脚本中看到您分配的$ARGV[0]。正如crashmstr所指出的那样,您需要使用many methods中的一个来执行第一个脚本。例如:

my $send_var = "This is a variable in param_send.pl...\n";
`perl param_receive.pl $send_var`;

或使用%ENV:

使用环境变量
my $send_var = "This is a variable in param_send.pl...\n";
$ENV['send_var'] = $send_var;

答案 2 :(得分:1)

Perl中的%ENV哈希包含环境变量,例如PATH,USER等。对这些变量的任何修改都只在当前进程中反映,并且可以生成任何子进程。父进程(恰好是此特定实例中的shell)不反映这些更改,因此当'param_send.pl'脚本结束时,所有更改都将丢失。

例如如果你要做类似的事情,

#!/usr/bin/perl
# param_send.pl
$ENV{'VAL'} = "Value to send to param_recv";


#!/usr/bin/perl
# param_recv.pl
print $ENV{'VAL'};

这不起作用,因为当param_send退出时VAL会丢失。一种解决方法是从param_send.pl调用param_recv.pl并将该值作为环境变量或参数传递,

#!/usr/bin/perl
# param_send.pl
$ENV{'VAL'} = "Value to send to param_recv";
system("perl param_recv.pl");

OR

#!/usr/bin/perl
# param_send.pl
system("perl param_recv.pl 'VAL'");

其他选项包括管道输出或您可以查看此PM node以获得更深奥的解决方案。

答案 3 :(得分:0)

仅供参考,我不是一个perl家伙。但总的来说,我认为你需要设置一个环境变量并从第一个脚本中调用另一个脚本(因此它可以作为第一个脚本的子流程访问环境变量),或者调用第二个脚本来自首先在命令行上传递参数。

您的ARGV变量仅适用于当前正在运行的脚本,因此您不能像这样使用它来将某些内容传递给另一个。

答案 4 :(得分:0)

要获得更高级的解决方案,请考虑使用socketsIPC