Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl使用shift命令解析命令行参数_Perl - Fatal编程技术网

perl使用shift命令解析命令行参数

perl使用shift命令解析命令行参数,perl,Perl,我有一个关于解析命令行参数和在Perl中使用shift命令的问题 我想用这一行来启动我的Perl脚本 /home/scripts/test.pl -a --test1 -b /path/to/file/file.txt 所以我想解析命令行参数。这是我剧本的一部分 if ($arg eq "-a") { $main::john = shift(@arguments); } elsif ($arg eq "-b") { $main::doe = shift(@arguments);

我有一个关于解析命令行参数和在Perl中使用shift命令的问题

我想用这一行来启动我的Perl脚本

/home/scripts/test.pl -a --test1 -b /path/to/file/file.txt
所以我想解析命令行参数。这是我剧本的一部分

if ($arg eq "-a") {
    $main::john = shift(@arguments);
} elsif ($arg eq "-b") {
    $main::doe = shift(@arguments);
}
我想在以后执行的
$command
变量中使用这些参数

my $var1=$john;
my $var2=$doe;
my $command = "/path/to/tool/tool --in $line --out $outputdir $var1 $var2";
&execute($command);
现在我遇到了两个问题:

在命令行中不必指定
-a
-b
。但是现在发生的事情是,当我没有指定
-a
时,我得到一条消息,在定义变量的行中使用了一个未初始化的值


第二个问题:
$var2
现在将等于
$doe
,因此在本例中是
/path/to/file/file.txt
。但是,我希望
$var2
等于
--text/path/to/file/file.txt
。我应该在哪里指定此
--text
。它不能标准地出现在
$命令中,因为当我没有指定
-b
时,它会出现问题。当我定义
$doe
时,我应该这样做吗?但是怎么做呢?

GetOpt::Long可能是一个选项:

关于您的样品:

您没有说明如果缺少
-a
-b
会发生什么,但默认设置可能会解决您的问题:

# Use 'join' as default if $var1 is not set
my $var1 = $john // 'john';
# Use an empty value as default if $var2 is not set
my $var2 = $doe // '';
关于
--text
前缀:

您想一直设置它吗

my $command = "/path/to/tool/tool --in $line --out $outputdir $var1 --text $var2";
或者,如果设置了
-b
=
$var2
,是否要设置它

# Prefix
my $var2 = "--text $john";

# Prefix with default
my $var2 = defined $john ? "--text $john" : '';
# Same, but long format
my $var2 = ''; # Set default
if ($john) {
    $var2 = "--text $john";
}

您应该根据变量的内容构建命令字符串

像这样

my $var1 = $john;
my $var2 = $doe;
my $command = "/path/to/tool/tool --in $line --out $outputdir";

$command .= " $var1"        if defined $var1;
$command .= " --text $var2" if defined $var2;

execute($command);

  • 在调用Perl子例程时,不要使用符号。这已经有十八年没有好的实践了

  • 不要使用包变量,如
    $main:xxx
    。词法变量(用
    my
    声明)几乎是所有必需的

  • 因为您确实应该使用该模块来避免在命令行解析中引入错误


perldoc GetOpt::Long