我在sub中有这三行代码,我试图只在一行上将它们写在一起..但我很遗失
my %p = @_;
my $arr = $p{name};
my @a = @$arr;
这样做的正确方法是什么?
谢谢你!答案 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)
好的,你正在做的是:
现在,我将不得不猜测你将放在中:
#!/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 );
此外:
a
和b
来说是双倍的,因为$a
和$b
用于排序。 (并且使用@a
会导致混淆)。