将值设置为未定义的变量

时间:2014-11-05 14:50:31

标签: perl

我正在尝试将默认值设置为某些变量。我知道该怎么做但我想使用子程序完成这项任务而且我遇到了问题。

我有三个变量:$t, $insize, $libtype. 如果它们未定义,这是为它们设置默认值的简单函数:

sub SetUnlessDefined {
   my $t = 1 if !( defined $t );
   my $insize = 300 if !( defined $insize );
   my $libtype = 0 if !( defined $libtype );
   return( $t, $insize, $libtype );
}

我执行这样的功能:

( $t, $insize, $libtype ) = SetUnlessDefined( $t, $insize, $libtype );

如果我的所有变量都未定义,则该函数运行正常,但如果我有任何值,则该函数无效。

任何人都可以建议我一个解决方案?或者是一种检查变量是否已定义以及是否未设置值的正确方法?

提前致谢

2 个答案:

答案 0 :(得分:5)

您没有读取子程序正文中的参数:

sub defaults {
    my ($t, $insize, $libtype) = @_;    # <--- HERE
    $t = 1 unless defined $t;
    $insize = 300 unless defined $insize;
    $libtype = 0 unless defined $libtype;
    return ($t, $insize, $libtype);
}

但是,还有其他方法可以解决这个问题:

sub defaults {
    my @defaults = (1, 300, 0);
    for my $i (0 .. $#defaults) {
        $_[$i] //= $defaults[$i];  # Perl 5.10 needed
    }
}

子程序调用不再需要赋值,因为参数别名为@_的成员:

defaults($t, $insize, $libtype);

答案 1 :(得分:0)

代码的my $t部分始终在运行,因此在定义了全局$t的情况下,本地$t被实例化为未定义,并返回。

解决方案是使用类似的东西

if (! defined $t ) {
    my $t = 1 ;
}

或者只是

if (! defined $t ) {
    $t = 1 ;
}

并且不要退货。

你也正在向函数发送参数,这些参数被忽略......也许整个事情可以在没有参数的情况下重做,没有第二个任务,就像这样

sub SetUnlessDefined {
   if (! defined $t ) {
       $t = 1 ;
   }
   if (! defined $insize ) {
       $insize = 3000;
   }
   if (! defined $libtype ) {
       $libtype = 0;
   }
}


SetUnlessDefined();