【问题标题】:Perl, passing array into subroutine, dealing with undeclared variablesPerl,将数组传递给子程序,处理未声明的变量
【发布时间】:2017-05-28 20:28:46
【问题描述】:

我有一个子程序,其中包含一些固定变量以及我在子程序中声明和使用的变量,但是当我调用这个子程序时,我无法声明它们。

例如:

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

当我尝试这样做时,我得到了一个错误

"在 test.pl 行的字符串 eq 中使用未初始化的值 $possible ……”

我该如何纠正这个问题?

【问题讨论】:

  • 您的问题与声明无关。
  • 如果您显示可在use strictuse warnings 下编译的代码,将会有很大帮助。
  • 如果您展示的代码可以在use strictuse warnings 下编译,将会有很大帮助。编造一些甚至不是 Perl 代码的东西会让你的问题变得过于模棱两可。

标签: arrays perl subroutine


【解决方案1】:

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

开头的子例程
    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

【讨论】:

  • 谢谢,这几乎正是我所需要的
【解决方案2】:

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

有几种处理方法:

  • 在变量上测试defined
  • 设置一个“默认”$possible //= "default_value" 如果未定义将有条件地分配。

或者完全做其他事情。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2021-04-03
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多