将 hashref 转换为 kv 对数组
Convert hashref to array of kv pairs
这是我的初始代码:
sub my_sub {
my $hash = {
age => 5, # default value for "age" key
@_ # the rest of the "hash" as an array
};
...
}
#used like so:
my_sub("age" => 42, ...);
但除了数组之外,我还想支持接受哈希引用。所以我试过了:
sub my_sub {
my $hash = {
age => 5, # default value for "age" key
ref(@_) eq "" ? @_ : %{$_[0]}
};
...
}
如果您像以前一样用数组调用它,ref(@_) eq ""
检查将为真,并且条件会像以前一样评估为 @_
。但我这辈子都无法让假案发挥作用。目前,它说匿名哈希中有奇数个元素。但是当我打印出 %{$_[0]}
的值时,我看到了 (age, 42, ...)
的预期扁平化数组 - 换句话说,它在打印出来的上下文中看起来是正确的,但是当它处于条件时它会呕吐,并且我不知道为什么。哈尔普
我不确定您为什么要在调用方中使用哈希引用,因为它只会使调用更加嘈杂。但是你可以使用
sub my_sub {
my %args = @_ == 1 ? %{ $_[0] } : @_;
$args{ age } //= 5;
...
}
或
sub my_sub {
my $args = @_ == 1 ? $_[0] : { @_ };
$args->{ age } //= 5; # Warning: modifies caller
...
}
从表面上看,第二个在提供哈希引用时速度更快(因为它不构建新的哈希)。但是,在实践中,每次都会在调用者中创建一个新的散列,从而取消所有好处。从好的方面来说,这也意味着修改散列通常不会产生任何后果(代码段中的评论指出的问题)。
这是我的初始代码:
sub my_sub {
my $hash = {
age => 5, # default value for "age" key
@_ # the rest of the "hash" as an array
};
...
}
#used like so:
my_sub("age" => 42, ...);
但除了数组之外,我还想支持接受哈希引用。所以我试过了:
sub my_sub {
my $hash = {
age => 5, # default value for "age" key
ref(@_) eq "" ? @_ : %{$_[0]}
};
...
}
如果您像以前一样用数组调用它,ref(@_) eq ""
检查将为真,并且条件会像以前一样评估为 @_
。但我这辈子都无法让假案发挥作用。目前,它说匿名哈希中有奇数个元素。但是当我打印出 %{$_[0]}
的值时,我看到了 (age, 42, ...)
的预期扁平化数组 - 换句话说,它在打印出来的上下文中看起来是正确的,但是当它处于条件时它会呕吐,并且我不知道为什么。哈尔普
我不确定您为什么要在调用方中使用哈希引用,因为它只会使调用更加嘈杂。但是你可以使用
sub my_sub {
my %args = @_ == 1 ? %{ $_[0] } : @_;
$args{ age } //= 5;
...
}
或
sub my_sub {
my $args = @_ == 1 ? $_[0] : { @_ };
$args->{ age } //= 5; # Warning: modifies caller
...
}
从表面上看,第二个在提供哈希引用时速度更快(因为它不构建新的哈希)。但是,在实践中,每次都会在调用者中创建一个新的散列,从而取消所有好处。从好的方面来说,这也意味着修改散列通常不会产生任何后果(代码段中的评论指出的问题)。