什么是Perl相当于Python的dict.get(键,默认)?

kjo*_*kjo 1 perl dictionary hashmap

Python的Perl哈希的对应物是dict(字典)对象.

如果d是Python dict,那么表达式

d.get(key, default)
Run Code Online (Sandbox Code Playgroud)

...评估d[key]是否存在,default否则.

除了三元表达之外,Perl是否对同一个想法有任何支持

exists $h{$key} ? $h{$key} : $default
Run Code Online (Sandbox Code Playgroud)

Sin*_*nür 10

Perl 5.10引入了定义或运算符//.你可以写:

$h{$key} // $default
Run Code Online (Sandbox Code Playgroud)

//经营者具有相同的优先级和结合的||.我们已经特别注意确保这个操作符"尽你所能"而不破坏旧代码,但是涉及空正则表达式的一些边缘情况现在可能会以不同的方式进行解析.

正如@Borodin在评论中指出的那样,这不会区分存在的哈希键映射到未定义的值与哈希中根本不存在的键.

模块Hash :: DefaultValue可能对此有所帮助.但是,虽然默认值可以是coderef,但似乎并不直观地允许每次访问的任意默认值.另一个类似的模块是Hash :: WithDefaults.

你也可以使用

[$default, $h{$key}]->[exists $h{$key}]
Run Code Online (Sandbox Code Playgroud)

但这并不比三元表达更有效,更好看.当然,你可以自己动手代替:

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";
Run Code Online (Sandbox Code Playgroud)

如果您喜欢冒险,可以将其写成:

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;
}
Run Code Online (Sandbox Code Playgroud)

您没有为您的请求提供上下文,但Perl中设置默认值的常用方法是从另一个源读取的值被覆盖使用该构造:

my %config = (%$default_config, %{ get_config(...) });
Run Code Online (Sandbox Code Playgroud)

  • 除了可能存在值为"undef"的哈希元素.如果OP真的需要检查一个不存在的元素然后定义 - 或者不够. (5认同)

dgw*_*dgw 5

您可以使用已知的三元表达式

my $value_or_default = exists $h{$key} ? $h{$key} : $default
Run Code Online (Sandbox Code Playgroud)

要么

my $value_or_default = $h{$key} // $default ;
Run Code Online (Sandbox Code Playgroud)

//定义或操作者.

如果要交换到已定义或运算符,则取决于您的数据和需求.不同之处在于,当您拥有一个未定义值的键时,您将获得不同的结果.

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 ;
}
Run Code Online (Sandbox Code Playgroud)

这导致:

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
Run Code Online (Sandbox Code Playgroud)

对于key1,密钥存在但值未定义,因此perl发出警告.