将hashref转换为kv对的数组



这是我的初始代码:

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, ...);

但是,除了数组之外,我还想支持使用hashref。所以我尝试过:

sub my_sub {
my $hash = {
age     => 5, # default value for "age" key
ref(@_) eq "" ? @_ : %{$_[0]}
};
...
}

如果像以前那样用数组调用它,则ref(@_) eq ""检查将为true,条件将像以前那样计算为@_。但我一辈子都不能让这个假案子得逞。目前,它表示匿名散列中有奇数个元素。但是当我打印出%{$_[0]}的值时,我看到了预期的(age, 42, ...)的扁平数组——换句话说,它在打印它的上下文中看起来是正确的,但当它在条件中时,它会发出barfs,我不知道为什么。暂停。

我不知道你为什么要在调用者中使用hash-ref,因为它只会让调用更嘈杂。但是你可以使用

sub my_sub {
my %args = @_ == 1 ? %{ $_[0] } : @_;
$args{ age } //= 5;
...
}

sub my_sub {
my $args = @_ == 1 ? $_[0] : { @_ };
$args->{ age } //= 5;   # Warning: modifies caller
...
}

从表面上看,当提供hash-ref时,第二个会更快(因为它不会构建新的hash(。但是,在实践中,每次都会在调用者中创建一个新的哈希,从而取消所有好处。从好的方面来说,这也意味着修改哈希(由代码片段中的注释标识的问题(通常不会产生任何后果。

最新更新