【问题标题】:How can I get the nth element of a dereferenced anonymous array?如何获取取消引用的匿名数组的第 n 个元素?
【发布时间】:2018-10-13 04:41:33
【问题描述】:
use strict;

my $anon = [1,3,5,7,9];
my $aref  = [\$anon];

print "3rd element: "  . $ { $aref } [2] . "\n";

我想通过$aref 变量获取匿名数组$anon 的第n 个元素。在代码中,我想通过将索引设为 2 来获取 $anon 的第三个元素,但它什么也没返回。如果我写$ { $aref } [0],那么它会返回类似 REF(0x7fd459027ac0)

如何获得第 n 个,例如 $anon 的第 3 个元素?

理由:

my @area = (
    qw[1 3 5 7 9],
    qw[2 4 6 8 0],
    qw[a e i u o],
    qw[b c d f g]
    );

foreach my $row (@area) {
    foreach my $cell (@$row)
    {
    # do some processing on the element
    print $cell . " ";
    }
    print "\n";
}

【问题讨论】:

  • "$aref 变量上的匿名数组$anon 的第n 个元素" "$aref 变量上的作用"什么意思?
  • “我想通过将索引设为 2 来获取 $anon 的第三个元素,但它什么也没返回” 没有子例程可以返回 nothing 并且没有变量可以包含 nothing。什么意思?
  • [ LIST ] 基本上是do { my @a = LIST; \@a } 的缩写,所以你有my @x = (1,3,5,7,9); my $anon = \@anon; my $y = \$anon; my @z = ($y); my $aref = \@z; 并且你需要${ ${ ${ $aref }[0] } }[2]$aref->[0]->$*->[2] 来获得那个古怪的数据结构。当然,您应该将my @array = (1,3,5,7,9); my $anon = \@array;$ { $aref } [2]$aref->[2] 一起使用。
  • my @foo = ( [ qw/a b c/ ], [ qw/1 2 3/ ], ... ) - 你真的应该阅读perlreftut
  • @simbabque 我看了一下链接;他们很有帮助。所以看来我基本上被困在试图引用qw( ) 返回的列表的过程中,诀窍是将qw 括在括号中(与您之前的评论相同),虽然我浏览了各种帖子,但我找不到它、文章、教程。

标签: perl


【解决方案1】:

如何获取取消引用的匿名数组的第 n 个元素?

您有太多 运算符的引用。您已经构建了三层深的嵌套结构,难怪您在导航时遇到问题

问题是您的$anon 已经是一个对匿名数组的引用。方括号[...] 构造一个匿名数组并返回对它的引用

你有

my $aref  = [\$anon]

创建另一个对具有一个元素的数组的引用:对 标量 $anon 的引用。

所以你已经建立了这个

$anon = [1, 3, 5, 7, 9]

$aref = [ \ [1, 3, 5, 7, 9] ]

所以

${$aref}[0]          is \ [1, 3, 5, 7, 9]
${${$aref}[0]}       is [1, 3, 5, 7, 9]
${${${$aref}[0]}}[2] is 5

但是你为什么要处理对数组的引用,尤其是对标量的引用?最好从一个普通的数组开始,然后写

my @array = ( 1, 3, 5, 7, 9 );
my $aref = \@array;

print $aref->[2];

输出

5

【讨论】:

  • 感谢您的回复。我补充了理由。我想在循环内迭代数组的数组元素,以便我可以处理它们。我必须使用qw 使它看起来简单易读,但是当我使用qw 时,看起来数组变得匿名了。我想遍历那些匿名数组及其元素。
【解决方案2】:

您有一个经典的列表数据结构,但有所不同。您需要获取外部数组引用的第一个元素,由$aref 给出,取消引用结果,然后获取该表达式返回的内部数组引用的第 n 个元素。这应该可以解决问题:

${ $aref->[0] }->[2]

您可能需要阅读perllol 甚至可能是perlref 以获取更多信息和想法。如果您可以控制此数据结构,则有更好的方法来构建它。例如,如果它是这样构建的:

my $anon = [1, 3, 5, 7, 9]; # a reference to an anonymous array
my $aref = [$anon]; # a reference to an anonymous array containing only the above reference

你可以这样做:

$aref->[0][2]

【讨论】:

  • 请在发布前检查您的代码。 $aref->[0]scalar \$anon 并且不会被索引。您的建议将导致 Not an ARRAY reference 警告。如果问题的答案似乎很明显,您应该三思而后行。
  • 啊,我错过了双重参考。谢谢@Borodin。我已经更新了我的答案。
  • 感谢您的回复。我在我的问题背后添加了理由。我想在循环内迭代数组的数组元素,以便我可以处理它们。我必须使用qw 使数组看起来简单易读,但是当我使用qw 时,看起来数组变得匿名了。这就是为什么我尝试使用解引用运算符获取这些匿名数组的第 n 个元素。
  • @Romario 在您更新的示例中,您实际上最终得到了一个一维扁平数组。我建议你使用 Data::Dumper 之类的东西来检查你的数据结构,看看实际发生了什么。 use Data::Dumper; die Dumper(\@area);关于阅读 perllol 立场的建议!
  • @mwp 是的,它是一种一维数组,我只是无法对其进行任何适当的迭代操作。我试过让它像oi65.tinypic.com/307qnox.jpg(截图),但迭代仍然有困难。我添加了 Data::Dumper 但无法获得任何有用的信息,所以我放弃了使用它。
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 2011-12-25
  • 2020-07-21
  • 2022-01-20
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多