我想通过传递4个数组来调用子例程,然后获取每个数组的第一个值,然后在子例程中创建一个新数组(传递的数组的第一个元素数组),然后返回阵列。这是我尝试过的代码
my @a = (97,34,6,7);
my @b = ("A", "B", "F", "D");
my @c = (5..15);
my @d = (1..10);
my @tailings = popmany ( \@a, \@b, \@c, \@d );
print @tailings;
sub popmany {
my @retlist = ();
for my $aref (@_) { #1
my $arrele = @$aref; #2
push @retlist , $arrele #3
}
return @retlist;
}
在#1中我使用循环并获取第一个数组,然后在第2行中我将整个数组赋值给变量,认为默认情况下perl只会将数组的第一个变量存储到@arrele中。我把$ arrele推到一个新的数组@retlist,对不起,我提到任何注释,所以我的程序可能是错的。但是这给我带来了类似的输出 441110
没有任何意义。
请解释一下代码我该怎么做。
答案 0 :(得分:10)
就在这里:
my $arrele = @$aref;
你要求perl将@{$aref}
放入标量上下文中,该上下文返回$ aref指向的数组的长度(元素数)。
而是尝试:
my $arrele = $aref->[0];
将代替访问数组的第一个元素。
答案 1 :(得分:5)
该行
my $arrele = @$aref;
将@$aref
数组的长度指定为$arrele
。要获取数组的第一个元素,您可以使用以下任何一个:
my $arrele = $$aref[0];
my $arrele = $aref->[0];
my ($arrele) = @$aref; # note the parenthesis which create list context
此外,由于您根据其他列表生成列表,因此可以使用map
:
sub popmany {
return map $_->[0], @_;
}
答案 2 :(得分:1)
sub popmany {
my @retlist = ();
for my $aref (@_) { #1
my $arrele = @$aref[0]; #2
push @retlist , $arrele#3
}
return @retlist;
}
答案 3 :(得分:1)
更简单地写为
sub popmany
{
map $_->[0], @_;
}