将 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

   ...
}

从表面上看,第二个在提供哈希引用时速度更快(因为它不构建新的哈希)。但是,在实践中,每次都会在调用者中创建一个新的散列,从而取消所有好处。从好的方面来说,这也意味着修改散列通常不会产生任何后果(代码段中的评论指出的问题)。