Perl,将数组传递给子程序,处理未声明的变量

Perl, passing array into subroutine, dealing with undeclared variables

我有一个 sub 有一些固定变量和我在 sub 中声明和使用的变量,但是当我调用这个 sub 时我不能声明它们。

例如:

sub func{
my ($firm1, $firm2, $possible) = @_;
...
if($possible eq "smth"){ # in case i passed this scalar
}
elsif($possible eq ("smth else" or undef/i_don_t_know)){ # in case i didn't passed this var, but i need it as at least undef or smth like that
}

func(bla, bla, bla); # ok
func(bla, bla); # not ok

当我尝试这样做时,出现错误

"Use of uninitialized value $possible in string eq at test.pl line ..."

我该如何纠正?

这不是声明的问题,而是传递了一个未定义的值。

有几种处理方法:

  • 测试 defined 变量
  • 设置一个'default' $possible //= "default_value" 如果未定义则有条件赋值。

或者完全做其他事情。

这不是声明的问题。如果只将两个参数传递给以

开头的子例程
    my ( $firm1, $firm2, $possible ) = @_;

那么$possibleundefined,意思就是设置为特殊值undef,就像NULLNonenil等其他语言

如您所见,您无法在不引起警告消息的情况下比较未定义的值,并且您必须首先使用 defined 运算符来检查变量是否已定义

认为 您想测试 $possible 是否已定义并设置为字符串 smth。你可以这样做

sub func {

    my ( $firm1, $firm2, $possible ) = @_;

    if ( defined $possible and $possible eq 'smth' ) {

        # Do something
    }
}

func( qw/ bla bla bla / );    # ok
func( qw/ bla bla / );        # now also ok