Perl - 将变量分配给引用的值

时间:2012-03-26 08:33:25

标签: arrays perl reference dereference assign

有一个类似的问题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的曲目中是否有任何方向,我认为这个例子表明了最好的,我打算做什么

4 个答案:

答案 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例程使用的预定义全局变量。与大多数预定义变量一样,它们可以使用,但它可能会导致奇怪的行为并且很难找到错误。