4

私はよく次のようなコードを書いていることに気づきます。

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

$optionalParamsRef->{verbosity}ただし、 2回繰り返すのは非常に冗長なようです。もっと短い方法はありますか?

編集:はい、これはtrue / falseをチェックしており、「存在する」ではないことを認識しています。私が探しているのは、これと同等の簡潔な機能です。

4

4 に答える 4

4

存在しないのではなく、 true$optionalParamsRef->{verbosity}をチェックしていることに注意してください。

これを行うための可能な方法:

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 に答える
4

他の人が述べたように、コードは虚偽をチェックします。偽の値が存在しないと見なした場合は、論理 OR を使用できます。おそらくこれはあなたが望むものではありません。

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

しかし、おそらく定義されたもので十分です。まだ存在のチェックではありませんが、ハッシュにundef値が含まれていない場合は、これで十分です。

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

//論理 or の代わりに「新しい」定義済み or 演算子を使用し||ます。これらの例は、常に何かを割り当てているため、投稿したコードと同等ではないことはわかっていますが、私の経験では、これはしばしば役立つので、役立つかもしれません.

于 2012-11-25T11:20:09.043 に答える
0
my $v = $optionalParamsRef->{verbosity};
$settingsHash{verbosity} = $v if $v;

for ($optionalParamsRef->{verbosity}) {
    $settingsHash{verbosity} = $_ if $_;
}
于 2012-11-25T08:44:51.717 に答える
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 に答える