我发现自己经常写这样的代码:
if ($optionalParamsRef->{verbosity}) {
$settingsHash{verbosity} = $optionalParamsRef->{verbosity};
}
$optionalParamsRef->{verbosity}
但是,重复两次似乎很冗长。有没有更短的方法?
编辑:是的,我意识到这是检查真/假而不是“存在”。我正在寻找的是与此等效的简洁功能。
我发现自己经常写这样的代码:
if ($optionalParamsRef->{verbosity}) {
$settingsHash{verbosity} = $optionalParamsRef->{verbosity};
}
$optionalParamsRef->{verbosity}
但是,重复两次似乎很冗长。有没有更短的方法?
编辑:是的,我意识到这是检查真/假而不是“存在”。我正在寻找的是与此等效的简洁功能。
正如其他人所提到的,您的代码检查错误。如果您认为假值不存在,则可以使用逻辑或。可能这不是你想要的。
$settingsHash{verbosity} = $optionalParamsRef->{verbosity} || $default;
但也许定义性就足够了。它仍然没有检查存在,但如果你的哈希不包含undef
值,这可能就足够了:
$settingsHash{verbosity} = $optionalParamsRef->{verbosity} // $default;
使用“新”定义或运算符//
而不是逻辑或||
。我知道这些示例并不等同于您发布的代码,因为它们总是分配一些东西,但根据我的经验,这通常很有用,所以也许它会有所帮助。
$optionalParamsRef->{verbosity}
请注意,您正在检查true, not exist。
可能的方法:
foreach my $k (qw/verbosity param1 param2 param3/) { #Enumerate keys here
$settingsHash{$k} = $optionalParamsRef->{$k} if exists($optionalParamsRef->{$k});
}
一个简洁的功能等价物:
sub {$_[0]=$_[1] if $_[1]}->($settingsHash{verbosity}, $optionalParamsRef->{verbosity});
但是,IMO,您的代码的主要问题是您只是有条件地设置 $settingsHash{verbosity},从而使您无法做一些更简单的事情,例如:
$settingsHash{verbosity} = $optionalParamsRef->{verbosity} || somedefault
甚至:
%settingsHash = ( %defaultSettings, %$optionalParamsRef );
my $v = $optionalParamsRef->{verbosity};
$settingsHash{verbosity} = $v if $v;
for ($optionalParamsRef->{verbosity}) {
$settingsHash{verbosity} = $_ if $_;
}