2

有一个类似的问题如何在 Perl 中将子例程调用的结果分配给数组引用?但我很好奇 perl 的可能性

perl 中是否存在直接取消引用元素引用数组的技巧?

在类似的代码中

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

4 回答 4

3

如果需要,您可以直接修改地球仪,但这不是一个好习惯。

sub test { return [1..3], [2..4]; }
(*x, *y) = test;
print "@x and @y";

输出:

1 2 3 and 2 3 4

这不适用于词法 ( my) 变量。要使其与 一起使用,您可以使用(而不是)strict声明变量。ourmy

于 2012-03-26T08:47:00.110 回答
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
}
于 2012-03-26T08:54:20.703 回答
1

@Qtax 的答案很简洁。我想知道它是否可以完成。不完全是你要求的,但接近。

sub test { return [1..3], [2..4]; }

my (%a);

@a{'ret1','ret2'} = test();

print @{$a{'ret1'}} ;
print @{$a{'ret2'}} ;
于 2012-03-26T11:12:06.257 回答
0

IMO 最好的方法是将数组 refs 分配给标量变量,并根据需要取消引用它们。

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例程使用的预定义全局变量。可以像大多数预定义变量一样使用它们,但它可能会导致奇怪的行为和难以发现的错误。

于 2012-03-26T12:36:57.993 回答