您的代码尽可能简单。您需要传递一个哈希并且您不想修改现有的哈希,因此您需要创建一个新的哈希。就是{ }
这样。
潜在的问题是foo
采用哈希引用而不是键值列表。
sub foo {
my %args = @_;
...
}
你仍然可以做你之前所做的一切:
foo( foo => 'bunnyfoofoo', bar => 'barbiebarbar' );
my $hash = {
foo => 'bunnyfoofoo',
bar => 'barbiebarbar',
};
foo( %$hash, baz => 'bazkethound' );
有两个优点。
您不必到处使用{ }
。
您可以安全地修改参数。
这是错误的:
sub f {
my $args = $_[0] // {};
my $foo = delete($args->{foo});
my $bar = delete($args->{bar});
croak("Unrecognized args " . join(', ', keys(%$args)))
if %$args;
...
}
还行吧:
sub f {
my %args = @_;
my $foo = delete($args{foo});
my $bar = delete($args{bar});
croak("Unrecognized args " . join(', ', keys(%args)))
if %args;
...
}