Perl哈希,数组和引用

时间:2016-02-24 14:14:56

标签: perl hash reference

我在sub中有这三行代码,我试图只在一行上将它们写在一起..但我很遗失

    my %p = @_;
    my $arr = $p{name};
    my @a = @$arr;

这样做的正确方法是什么?

谢谢你!

2 个答案:

答案 0 :(得分:3)

my %p = @_;
假设

@_包含键值对,然后用于构造哈希值%p

my $arr = $p{name};

假设参数列表包含name, [1, 2, 3,]行的内容,以便$p{name}是对数组的引用。

my @a = @$arr;

取消引用数组引用以获取数组@

这是一个可以在sub中使用此前奏的调用:

func(this => 'that', name => [1, 2, 3]);

如果要减少单个语句的整个前奏,可以使用:

my @a = @{ { @_ }->{name} };

如:

#!/usr/bin/env perl

use strict;
use warnings;

use YAML::XS;

func(this => 'that', name => [1, 2, 3]);

sub func {
    my @a = @{ { @_ }->{name} };
    print Dump \@a;
}

输出:

---
- 1
- 2
- 3

如果name指向的数组很大,如果需要浅层副本,那么最好坚持使用引用:

my $aref = { @_ }->{ name };

答案 1 :(得分:0)

好的,你正在做的是:

  • 将传递给sub的元素列表分配给哈希。
  • 从该哈希值(似乎是数组引用)中提取值
  • 取消引用 到一个独立的数组中。

现在,我将不得不猜测你将放在中:

#!/usr/bin/perl

use warnings;
use strict;

use Data::Dumper;

sub test {
    my %p = @_;
    my $arr = $p{name};
    my @a = @$arr;
    print Dumper \@a; 
}

my %input = ( fish => [ "value", "another value" ],
              name => [ "more", "less" ], );

test ( %input ); 

考虑到这一点:

sub test {
    print join "\n", @{{@_}->{name}},"\n";
}

但实际上,我建议您可能想要做的是首先传入hashref:

#!/usr/bin/perl

use warnings;
use strict;

use Data::Dumper;

sub test {
    my ( $input_hashref ) = @_;
    print Dumper \@{$input_hashref -> {name}};
}

my %input = ( fish => [ "value", "another value" ],
              name => [ "more", "less" ], );
test ( \%input ); 

此外:

  • 不要使用单字母变量名称。这是糟糕的风格。
  • 对于ab来说是双倍的,因为$a$b用于排序。 (并且使用@a会导致混淆)。