如何将空参数传递给从主perl脚本[backtics]调用的perl脚本

如何将空参数传递给从主perl脚本[backtics]调用的perl脚本,perl,unix,Perl,Unix,我想调用一个perl脚本(B.pl),它将通过传递多个可选参数,从主perl脚本(a.pl)列出远程服务器中可用的文件 由于参数是可选的,如果我使用backticks,那么在B.pl中参数被分配到了错误的变量 如果我使用@list=system(B.pl,argv0,argv1,argv2)然后,尽管某些参数未定义,但在B.pl中正确分配了它,但在调用脚本中,标准输出没有分配给@list 我是perl新手,请在此场景中进行指导。有没有办法用倒勾传递空参数 在A.pl中: my @filelist

我想调用一个perl脚本(B.pl),它将通过传递多个可选参数,从主perl脚本(a.pl)列出远程服务器中可用的文件

由于参数是可选的,如果我使用backticks,那么在B.pl中参数被分配到了错误的变量

如果我使用
@list=system(B.pl,argv0,argv1,argv2)然后,尽管某些参数未定义,但在B.pl中正确分配了它,但在调用脚本中,标准输出没有分配给@list

我是perl新手,请在此场景中进行指导。有没有办法用倒勾传递空参数

在A.pl中:

my @filelist = system( B.pl, $argv0, $argv1, $argv2, $argv3);
my @filelist1 = `B.pl $argv0 $argv1 $argv2 $argv3`;
在B.pl中:

my $loc   = uc( $ARGV[0] );
my $msk   = uc( $ARGV[1] );
my $usr   = $ARGV[2];
my $usr1  = $ARGV[3];

不幸的是,backticks运算符或
readpipe
的安全版本不存在。多年来,它一直在
perl
待办事项列表中

但您可以使用
open
轻松完成这项工作:

open my $handle, '-|', 'B.pl', $argv0, $argv1, $argv2, $argv3
    or die "unable to run external command: $!";
my $output = do { local $/; <$handle> };
close $handle
    or die "unable to capture output from child command: $!";
$? and die "remote command exited with non zero return code: $?";
打开我的$handle,'-|','B.pl',$argv0,$argv1,$argv2,$argv3
或“无法运行外部命令:$!”;
my$output=do{local$/;};
关闭$handle
或“无法从子命令捕获输出:$!”;
$? 和die“远程命令退出,返回非零代码:$?”;

这不是关于Perl的问题,而是关于shell的问题。您试图传递一组参数,其中一些是可选的。幸运的是,这是一个众所周知的问题。答案是传递命名选项,而不是位置参数。在Perl中实现这一点的标准方法是使用

例如,在
B.pl
中,您可以说

use Getopt::Long;
my ($loc, $msk, $usr, $usr1);
GetOptions(
    "loc=s"     => \$loc,
    "msk=s"     => \$msk,
    "usr=s"     => \$usr,
    "usr1=s"    => \$usr1,
) or die "Something wrong with your options!";
A.pl
中的调用将为:

my @filelist1 = `B.pl '--loc=$argv0' '--msk=$argv1' '--usr=$argv2' '--usr1=$argv3'`;
还有更复杂的方法。例如,根据,我们了解。

您可以使用“零长度字符串”(
)作为背面记号内的参数:

perl -e "print `perl -e 'print $ARGV[2]' 0 '' 2`"

使用perl模块处理命令行选项,例如Getopt::Std

系统
返回被调用方的退出值,不显示它打印的内容。请显示您如何调用<代码> B.pl < /C> >以及如何分配它接收的参数。您应该考虑使用<代码> -名称Value/Cult>符号作为可选参数,并使用GETPop::Load解析命令行。哦,嘿,这完全有效。没关系,这比我的答案要好得多。@darch,我不同意。使用开关是更好的选择args@darchIMHO命令行开关是非微小和非短维护跨度脚本的更好选择。