gpt4 book ai didi

perl - 子程序参数作为没有临时变量的键值对

转载 作者:行者123 更新时间:2023-12-04 13:48:26 26 4
gpt4 key购买 nike

在 Perl 中,我一直很喜欢参数传递的键值对风格,
fruit( apples => red );
我经常这样做:

sub fruit {
my %args = @_;
$args{apples}
}

纯粹是为了紧凑并且有不止一种方法可以做到这一点,有没有办法:
  • 访问键值对而不分配 @_散列? IE。在一个声明中?
  • 子程序的参数是否自动成为哈希引用,也许是通过子程序原型(prototype)?

  • 没有:
  • 分配给临时变量 my %args = @_;
  • 让调用者通过引用传递,即 fruit({ apples => red });纯粹为了美观


  • 已尝试
  • ${%{\@_}}{apples}
    试图引用 @_ ,将其解释为哈希引用,并通过键访问值。

    但我得到一个错误,它不是一个哈希引用。 (这不是 ^.^ )我正在考虑 C 语言,您可以在其中转换指针等,并避免显式重新分配。
  • 我也尝试过子程序原型(prototype)
    sub fruit (%) { ... }
    ...但论点被折叠成 @_照常。
  • 最佳答案

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

    my $apples  = ${ { @_ } }{apples};
    my $oranges = ${ { @_ } }{oranges};

    您还可以使用更简单的后取消引用语法
    my $apples  = { @_ }->{apples};
    my $oranges = { @_ }->{oranges};

    不过,那将是非常低效的。您将为每个参数创建一个新的哈希。这就是通常使用命名散列的原因。
    my %args = @_;
    my $apples = $args{apples};
    my $oranges = $args{oranges};

    然而,另一种选择是使用散列片。
    my ($apples, $oranges) = @{ { @_ } }{qw( apples oranges )};

    以下是取消引用后的版本,但仅在 5.24+[1] 中可用:
    my ($apples, $oranges) = { @_ }->@{qw( apples oranges )};

  • 如果您使用以下内容,它在 5.20+ 中可用:
    use feature qw( postderef );
    no warnings qw( experimental::postderef );
  • 关于perl - 子程序参数作为没有临时变量的键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34970871/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com