当我运行以下没有参数的script.pl脚本时:
./script.pl
我没有收到消息No arg
。为什么?如何识别$param
是空值还是空值,与ksh中的[ -z
相同?
#!/usr/bin/perl
my $param = $ARGV[0];
if ($param = "") {
print No arg;
} else {
print arg: $param;
}
答案 0 :(得分:9)
因为它不是Perl。你在哪里学习这种语法?它有很多不妥之处。
$param = ""
为$param
分配一个空字符串,这不是您想要的。
null在Perl中拼写为undef
。
要比较字符串,请使用eq
operator。
您必须quote字符串:print "No arg"
更容易:
#!/usr/bin/perl
if (@ARGV) {
print 'have parameters';
} else {
print q{don't have parameters};
}
答案 1 :(得分:3)
这是一个更好地说明它的例子。
if( $#ARGV == -1 ){
print "No arguments passed.\n";
} else if( $#ARGV == 0 ){
print "One argument passed.\n";
} else {
print $#ARGV +1 ."arguments passed.\n";
}
我喜欢使用“标量@ARGV”,因为它表示数组中的元素数量。相反,$#ARGV是数组中最后一个元素的索引。这就是为什么它一个接一个。 如果$ [(这是一个设置Perl数组的起始索引的特殊变量。)设置为1而不是0(默认值),那么为了我们的目的,$#ARGV不会被一个关闭。我不会贬值$ [因为它是一个全球性的。改变可能会打破很多模块。
my $argument_count = scalar @ARGV;
if( $argument_count == 0 ){
print "No arguments passed.\n";
} else if( $argument_count == 1 ){
print "One argument passed.\n";
} else {
print "$argument_count arguments passed.\n";
}
答案 2 :(得分:2)
好吧,似乎人们发现我之前的答案误导,所以这次是另一次尝试,这次更直接。
您正在寻找的考试是defined
:
my $param = $ARGV[0];
if (defined $param) {
print "arg: $param\n";
} else {
print "No arg\n";
}
如果没有足够的参数填充$ARGV[0]
(或其他后续元素),该位置的值将为undef
,因此defined
测试将评估为false。
答案 3 :(得分:0)
如果param为空,你可以自动制作一个参数:
$ARGV[0] || 'yourParam';
答案 4 :(得分:0)
如果没有传递参数,这里有一个方便的代码片段可以让脚本中止错误:
if (not defined $ARGV[0]) {
print STDERR "Error: missing parameter. Usage: perl $0 <required-parameter>\n";
exit 1;
}
(有更紧凑,更冗长/更健壮的方式来写这个,但作为Perl新手,我发现这提供了清晰度和简洁性的良好平衡。)