子例程参数为没有临时变量的键值对

iPh*_*ian 6 perl hash subroutine subroutine-prototypes

在Perl中,我总是喜欢参数传递的键值对样式,

fruit( apples => red );

我做了很多:

sub fruit {
    my %args = @_;
    $args{apples}
}
Run Code Online (Sandbox Code Playgroud)

纯粹为了紧凑而且有多种方法可以做到这一点,有没有办法:

  • 访问键值对而不分配@_哈希?即一个声明?

  • 让子程序的参数自动成为哈希引用,也许通过子程序原型?

无:

  • 分配给临时变量 my %args = @_;

  • 让呼叫者通过引用传递,即fruit({ apples => red }); 纯粹为了美学


尝试

  • ${%{\@_}}{apples}

    尝试引用@_,将其解释为哈希引用,并通过键访问值.

    但我得到一个错误,它不是哈希引用.(它不是^.^)我正在考虑C,你可以在其中投射指针,并避免明确的重新分配.

  • 我也试过子程序原型

    sub fruit (%) { ... }

    ......但是这些论点@_像往常一样崩溃了.

ike*_*ami 7

如果没有哈希,则无法执行哈希查找(${...}{...}).但是你可以创建一个匿名哈希.

my $apples  = ${ { @_ } }{apples};
my $oranges = ${ { @_ } }{oranges};
Run Code Online (Sandbox Code Playgroud)

您还可以使用更简单的取消引用语法

my $apples  = { @_ }->{apples};
my $oranges = { @_ }->{oranges};
Run Code Online (Sandbox Code Playgroud)

那将是非常低效的.您将为每个参数创建一个新哈希.这就是通常使用命名哈希的原因.

my %args = @_;
my $apples  = $args{apples};
my $oranges = $args{oranges};
Run Code Online (Sandbox Code Playgroud)

然而,另一种方法是使用散列片.

my ($apples, $oranges) = @{ { @_ } }{qw( apples oranges )};
Run Code Online (Sandbox Code Playgroud)

以下是de-derefence版本,但它仅在5.24+ [1]中提供:

my ($apples, $oranges) = { @_ }->@{qw( apples oranges )};
Run Code Online (Sandbox Code Playgroud)
  1. 如果您使用以下内容,它在5.20+中可用:

    use feature qw( postderef );
    no warnings qw( experimental::postderef );
    
    Run Code Online (Sandbox Code Playgroud)

  • [添加别人对你自己的答案来做出更好的答案](http://meta.stackexchange.com/questions/35211/adding-someone-elses-answer-to-your-own-to-make-a-better -回答) (2认同)