作者:沉沦850 | 来源:互联网 | 2023-02-05 15:58
Python的Perl哈希的对应物是dict
(字典)对象.
如果d
是Python dict
,那么表达式
d.get(key, default)
...评估d[key]
是否存在,default
否则.
除了三元表达之外,Perl是否对同一个想法有任何支持
exists $h{$key} ? $h{$key} : $default
?
1> Sinan Ünür..:
Perl 5.10引入了定义或运算符//
.你可以写:
$h{$key} // $default
该//
经营者具有相同的优先级和结合的||
.我们已经特别注意确保这个操作符"尽你所能"而不破坏旧代码,但是涉及空正则表达式的一些边缘情况现在可能会以不同的方式进行解析.
正如@Borodin在评论中指出的那样,这不会区分存在的哈希键和映射到未定义的值与哈希中根本不存在的键.
模块Hash :: DefaultValue可能对此有所帮助.但是,虽然默认值可以是coderef,但似乎并不直观地允许每次访问的任意默认值.另一个类似的模块是Hash :: WithDefaults.
你也可以使用
[$default, $h{$key}]->[exists $h{$key}]
但这并不比三元表达更有效,更好看.当然,你可以自己动手代替:
use strict;
use warnings;
sub get_value_or_default(\%$$) {
exists $_[0]->{$_[1]} ? $_[0]->{$_[1]} : $_[2];
}
my %hash = ( a => 1 );
print get_value_or_default(%hash, b => 33), "\n";
print get_value_or_default(%hash, b => 75), "\n";
print get_value_or_default(%hash, c => 96), "\n";
如果您喜欢冒险,可以将其写成:
use v5.24;
use warnings;
use feature 'signatures';
no warnings 'experimental::signatures';
sub get_value_or_default($hash, $key, $default) : prototype(\%$$) {
exists $hash->{$key} ? $hash->{$key} : $default;
}
您没有为您的请求提供上下文,但Perl中设置默认值的常用方法是从另一个源读取的值被覆盖使用该构造:
my %cOnfig= (%$default_config, %{ get_config(...) });
除了可能存在值为"undef"的哈希元素.如果OP真的需要检查一个不存在的元素然后定义 - 或者不够.
2> dgw..:
您可以使用已知的三元表达式
my $value_or_default = exists $h{$key} ? $h{$key} : $default
要么
my $value_or_default = $h{$key} // $default ;
的//
是定义或操作者.
如果要交换到已定义或运算符,则取决于您的数据和需求.不同之处在于,当您拥有一个未定义值的键时,您将获得不同的结果.
my %hash = ( key1 => undef ,
key3 => 1 ) ;
my $default = 42 ;
foreach my $test ( qw(key1 key2 key3) ) {
printf "%s => %s exists\n%s => %s defined-or\n\n" ,
$test ,
exists $hash{$test} ? $hash{$test} : $default ,
$test ,
$hash{$test} // $default ;
}
这导致:
Use of uninitialized value $hash{"key1"} in printf at x.pl line 11.
key1 => exists
key1 => 42 defined-or
key2 => 42 exists
key2 => 42 defined-or
key3 => 1 exists
key3 => 1 defined-or
对于key1,密钥存在但值未定义,因此perl发出警告.