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

3

有一个类似的问题如何在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个回答

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 这是一个非常好的可能性;如果没有更接近我想要的答案,我会接受它作为答案。 - Hachi

2
这并没有回答关于直接去引用的问题,但是在你所做的操作中:

您正在进行:

sub test { return([1..4],[5..8]); }
my (@a,@b);
my @result = test();
@a = $result[0]; @b = $result[1];

这句话不完全正确,执行后你的@a和@b数组会变成二维数组。

应该这样说:

@a = @{$result[0]};
@b = @{$result[1]};

或者,你很可能已经知道:

my ($a, $b) = test();

或者:

for my $element (test()) {
     # $element is an array ref
}

哦,对不起,你是完全正确的;在打字的时候我忘记加上 @{} 了,谢谢。 - Hachi

1

@Qtax的回答很简洁明了。我在想还有其他方法可以实现。虽然不完全是你所要求的,但很接近。

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

my (%a);

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

print @{$a{'ret1'}} ;
print @{$a{'ret2'}} ;

0
在我看来,最好的方法是将数组引用分配给标量变量,并根据需要对其进行解引用。
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 程序预定义的全局变量。虽然像大多数预定义变量一样,它们可以被使用,但这可能导致奇怪的行为和难以发现的错误。

我同意这是最合理的方式,但我对可能性很好奇;这里的$a$和$b$只是一个例子;在实际使用中,我使用有意义的变量名。 - Hachi
@Hachi 这里没有什么神秘的。你正在返回一个包含两个标量参数的列表。你可以将它们赋值给标量变量,或者解引用为数组。就是这样。使用 *a 的全局解决方案依赖于打破规则,并且与使用中间标量 $x = test(); @x = @$x 没有太大区别。为了节省输入,我不建议使用全局变量。 - TLP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接