有一个类似的问题How can I assign the result of a subroutine call to array references in Perl?,但我对perl的可能性感到好奇
在perl中是否存在hack直接从元素方面取消引用引用数组?
中的代码
sub test { return([1..4],[5..8]); }
my (@a,@b);
my @result = test();
@a = @{$result[0]}; @b = @{$result[1]};
我想将代码缩短为简单的语句,如
sub test { return([1..4],[5..8]); }
my (\@a,\@b) = test();
或循环
foreach my $element (\"1",\"2",\"3") {
my $dereferenced_element = $$element;
写一些像
这样的东西会很好foreach my \$element (\"1",\"2",\"3") {
我知道这种语法没有多大意义,因为我不想为变量的引用赋值,而是为变量本身分配一个解除引用的值
但我很好奇Perl的曲目中是否有任何方向,我认为这个例子表明了最好的,我打算做什么
答案 0 :(得分:3)
如果需要,您可以直接修改地球仪,但这不是一个好习惯。
sub test { return [1..3], [2..4]; }
(*x, *y) = test;
print "@x and @y";
输出:
1 2 3 and 2 3 4
这不适用于词法(my
)变量。要使其与strict
一起使用,您可以使用our
(而不是my
)声明变量。
答案 1 :(得分:2)
这不是回答有关直接解除引用的问题,而是
你在做什么:
sub test { return([1..4],[5..8]); }
my (@a,@b);
my @result = test();
@a = $result[0]; @b = $result[1];
不完全正确,此后你的@a和@b数组变成了2d数组。
相反,你应该说:
@a = @{$result[0]};
@b = @{$result[1]};
或者,你可能已经知道了:
my ($a, $b) = test();
或:
for my $element (test()) {
# $element is an array ref
}
答案 2 :(得分:1)
@Qtax答案很整洁。我想知道其他事情可以做到。不完全是你要求的,但接近。
sub test { return [1..3], [2..4]; }
my (%a);
@a{'ret1','ret2'} = test();
print @{$a{'ret1'}} ;
print @{$a{'ret2'}} ;
答案 3 :(得分:0)
IMO的最佳方法是将数组引用分配给标量变量,并根据需要取消引用它们。
my ($x, $y) = test();
my @arrayx = @$x;
my @arrayy = @$y;
print "Element 1 in \$x is: $x->[1]\n";
for my $element (@$x) { ... }
您还应该知道,使用$a
和$b
作为变量是一个坏主意,因为它们是sort
例程使用的预定义全局变量。与大多数预定义变量一样,它们可以使用,但它可能会导致奇怪的行为并且很难找到错误。