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

lid*_*dia 2 perl

当我运行以下没有参数的script.pl脚本时:

./script.pl
Run Code Online (Sandbox Code Playgroud)

我没有收到消息No arg.为什么?如何识别if $param是空值还是空值,与[ -zksh 相同?

#!/usr/bin/perl
my $param = $ARGV[0];
if ($param = "") {
    print No arg;
} else {
    print arg: $param;
}
Run Code Online (Sandbox Code Playgroud)

dax*_*xim 9

因为它不是Perl.你在哪里学习这种语法?它有很多错误.

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

  2. null undef在Perl中拼写.

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

  4. 你必须引用字符串:print "No arg"

更容易:

#!/usr/bin/perl
if (@ARGV) {
    print 'have parameters';
} else {
    print q{don't have parameters};
}
Run Code Online (Sandbox Code Playgroud)


gde*_*dey 5

这里有一个例子可以更好地说明它。

if( $#ARGV == -1 ){
    print "No arguments passed.\n";
} else if( $#ARGV == 0 ){
    print "One argument passed.\n";
} else {
    print $#ARGV +1 ."arguments passed.\n";
}
Run Code Online (Sandbox Code Playgroud)

我喜欢使用“标量@ARGV”,因为它代表数组中元素的数量。相反,$#ARGV 是数组中最后一个元素的索引。这就是为什么它是一个关闭。如果 $[(这是一个设置 Perl 数组起始索引的特殊变量。)设置为 1 而不是 0(默认值),那么 $#ARGV 就我们的目的而言不会关闭 1。我不会乱用 $[ 因为它是全局的。更改可能会破坏很多模块。

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";
}
Run Code Online (Sandbox Code Playgroud)