4

我发现自己经常写这样的代码:

if ($optionalParamsRef->{verbosity}) {
    $settingsHash{verbosity} = $optionalParamsRef->{verbosity};
}

$optionalParamsRef->{verbosity}但是,重复两次似乎很冗长。有没有更短的方法?

编辑:是的,我意识到这是检查真/假而不是“存在”。我正在寻找的是与此等效的简洁功能。

4

4 回答 4

4

正如其他人所提到的,您的代码检查错误。如果您认为假值不存在,则可以使用逻辑或。可能这不是你想要的。

$settingsHash{verbosity} = $optionalParamsRef->{verbosity} || $default;

但也许定义性就足够了。它仍然没有检查存在,但如果你的哈希不包含undef值,这可能就足够了:

$settingsHash{verbosity} = $optionalParamsRef->{verbosity} // $default;

使用“新”定义或运算符//而不是逻辑或||。我知道这些示例并不等同于您发布的代码,因为它们总是分配一些东西,但根据我的经验,这通常很有用,所以也许它会有所帮助。

于 2012-11-25T11:20:09.043 回答
4

$optionalParamsRef->{verbosity}请注意,您正在检查true, not exist

可能的方法:

foreach my $k (qw/verbosity param1 param2 param3/) { #Enumerate keys here
     $settingsHash{$k} = $optionalParamsRef->{$k} if exists($optionalParamsRef->{$k});
}
于 2012-11-25T08:46:00.660 回答
0

一个简洁的功能等价物:

sub {$_[0]=$_[1] if $_[1]}->($settingsHash{verbosity}, $optionalParamsRef->{verbosity});

但是,IMO,您的代码的主要问题是您只是有条件地设置 $settingsHash{verbosity},从而使您无法做一些更简单的事情,例如:

$settingsHash{verbosity} = $optionalParamsRef->{verbosity} || somedefault

甚至:

%settingsHash = ( %defaultSettings, %$optionalParamsRef );
于 2012-11-25T12:19:19.530 回答
0
my $v = $optionalParamsRef->{verbosity};
$settingsHash{verbosity} = $v if $v;

for ($optionalParamsRef->{verbosity}) {
    $settingsHash{verbosity} = $_ if $_;
}
于 2012-11-25T08:44:51.717 回答