perl +识别param是否为ARG的空值

时间:2010-07-27 08:07:15

标签: perl

当我运行以下没有参数的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;
}

5 个答案:

答案 0 :(得分:9)

因为它不是Perl。你在哪里学习这种语法?它有很多不妥之处。

  1. $param = ""$param分配一个空字符串,这不是您想要的。

  2. null在Perl中拼写为undef

  3. 要比较字符串,请使用eq operator

  4. 您必须quote字符串:print "No arg"

  5. 更容易:

    #!/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新手,我发现这提供了清晰度和简洁性的良好平衡。)