【问题标题】:How can I assign the result of a subroutine call to array references in Perl?如何将子例程调用的结果分配给 Perl 中的数组引用?
【发布时间】:2009-10-07 11:18:14
【问题描述】:

是否可以将数组变量分配给数组引用而不是标量变量?

而不是这个:

($a, $b) = some_sub(\@d, \@e);

我想要这样的东西:

(@x, @y) = some_sub(\@x1, \@y1);

如果是这样,我怎样才能取消引用它。就像以前的情况一样,@$xxxx 为我们做。

谢谢。

【问题讨论】:

  • 你永远无法在左侧使用(@a, @b) 并得到你想要的。 @a 将收到传回的 所有 值列表,@b 将是空列表。

标签: perl arrays reference


【解决方案1】:

您可以分两步完成(实际上是 3 行):

my ($x_ref, $y_ref) = some_sub(\@x1, \@y1);
my @x = @{ $x_ref };
my @y = @{ $y_ref };

问题是 - 简单地放弃直接数组并开始在任何地方使用引用不是更简单吗?

【讨论】:

  • ... 在这种情况下,您将使用 $x_ref->[0] 来引用第一个元素,并使用 [] 来定义引用,例如$x1 = [4, 5];之后 $x1->[0] == 4 和 $x1->[1] == 5
【解决方案2】:

引用是一个标量(根据定义),即使它所指的不是。所以我不太确定“将数组变量分配给数组引用而不是标量变量”是什么意思。您可以将push 数组引用作为成员引用到普通数组中,然后直接取消引用它们。您还可以从子例程返回引用。

您可以取消引用分配中子例程的返回值。我想知道这是否是你想要做的那种事情?

my @array = @{ some_sub() };

请注意,由于 Axeman cmets 低于这本身并不是一个好主意或特别必要。如果您真正想要的是将项目从子例程中取出然后放入数组中,Depesz's suggestion 就是您需要的那种东西。

我强烈推荐 perldoc perlreftut 作为 Perl 中引用的介绍。您还可以查看perldoc perllolperldoc perldsc

如果你解释一下你真正想要做什么以及为什么这样做可能会有所帮助?

【讨论】:

  • 似乎是由 Perl 新手设计的 some_sub 的解决方法。任何在列表上下文中传回 single 数组引用的人都不知道他们在 Perl 中做了什么,或者不够努力。
  • @Axeman:这是一个公平的观点。我真的不是在暗示它,而是试图弄清楚 OP 的意思或想要什么。我正在编辑我的答案以澄清这一点。
  • 在列表上下文中传递单个数组引用有什么问题?一个项目的列表与任何其他列表一样好。您不必总是因为您有列表上下文而返回一长串事物:特别是如果您是指向数千个事物的数组引用点。 :)
  • @Axeman,我倾向于对创建具有特殊上下文相关行为的潜艇保持警惕。在大多数情况下,如果我编写一个在标量上下文中返回数组 ref 的 sub,它也会在列表上下文中这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2016-12-26
  • 2011-01-06
  • 1970-01-01
相关资源
最近更新 更多