我正在尝试将默认值设置为某些变量。我知道该怎么做但我想使用子程序完成这项任务而且我遇到了问题。
我有三个变量:$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 );
如果我的所有变量都未定义,则该函数运行正常,但如果我有任何值,则该函数无效。
任何人都可以建议我一个解决方案?或者是一种检查变量是否已定义以及是否未设置值的正确方法?
提前致谢
答案 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();