【问题标题】:Perl: Array of Array ReferencesPerl:数组引用数组
【发布时间】:2016-02-25 23:18:09
【问题描述】:

可能会在某处重复,但我查看了每个 perl 数组引用/取消引用示例,我已经能够找到并尝试运行此字符串的 10 多种不同组合以获得我想要的输出。如@$array[i]、@{$array[i]}、@{@$array[i]}等

所以我有一个数组引用数组。我通过创建一个全局数组来构建它,然后将较小的临时数组推送到该全局数组中。运行 Dumper() 时的最终结果如下所示。

$VAR1 = [ 1 ]; $VAR2 = []; $VAR3 = []; $VAR4 = []; $VAR5 = []; $VAR6 = []; $VAR7 = [ 1 ]; $VAR8 = []; $VAR9 = []; $VAR10 = []; $VAR11 = [ 1 ]; $VAR12 = []; $VAR13 = [ 1 ]; $VAR14 = []; $VAR15 = [ 1 ];

现在我试图通过使用来取消引用这些数组之一

my @arrayRef = @{$redArray[$i]};
print "Here: " . @arrayRef[0];

@redArray 是我的全局数组。

我看到的 @{$redArray[$i]} 部分从全局数组中获取引用,然后尊重它,它应该作为数组返回,如 [] 或 [1] 或 [1,1 .... .]

然后在第二行,我想获取数组的第一个元素,它不会返回任何内容/错误或 1。

当打印“这里:”时。 @arrayRef[0];虽然运行,我看到的输出是

Here: Here: Here: Here: Here: Here: Here: Here: Here: Here: Here: Here: Here: Here: Here:

【问题讨论】:

  • 仅供参考,如果您将 Data::Dumper 的输出传递给参考,则它的输出会更容易阅读。而不是print Dumper @foo;print Dumper \@foo;
  • 感谢好提示,我会尝试使用它。 [[]、[]、[]、[]、[]、[]、[1]、[]、[]、[]、[1]、[]、[1]、[]、[1]] ;
  • 注意在print "Here: " . @arrayRef[0];中,应该写成$arrayRef[0]。如果您启用了use warnings;,则会指出这一点。更进一步,双引号内插,所以它可以缩短一点:print "Here: $arrayRef[0]";

标签: perl dereference


【解决方案1】:

正如其他人所提到的,您对何时应该使用 $ 和 @ 符号感到困惑。 (公平地说,它在 Perl 中并不总是很明显。) glenn 提供的 Perl 参考教程链接是最好的资源。也许一些例子会有所帮助:

use strict;
use warnings;

my @important_years = (1066, 1492, 1776);
my @recent_years    = (2010, 2012, 2014);

my $important_years_ref = \@important_years;
my $recent_years_ref    = \@recent_years;

my @redArray = ($important_years_ref, $recent_years_ref);

printf("%s\n", $redArray[0][0]);    # 1066
printf("%s\n", $redArray[0][1]);    # 1492
printf("%s\n", $redArray[0][2]);    # 1776

printf("%s\n", $redArray[1][0]);    # 2010
printf("%s\n", $redArray[1][1]);    # 2012
printf("%s\n", $redArray[1][2]);    # 2014

# Get a reference to the "important years" array
my $important_years_copy_ref = $redArray[0];
printf("%s\n", $important_years_copy_ref->[2]);  # 1776

# Or make brand new array by dereferencing
# the "important years" reference stored in @redArray
my @important_years_copy = @{$redArray[0]};
printf("%s\n", $important_years_copy[2]);        # 1776

【讨论】:

    【解决方案2】:

    多亏了 glenn jackman 和 ThisSuitIsBlackNot,我才弄明白了。

    问题是我上面所做的参考或多或少是正确的,但后来我的代码中有一个错误,我使用的参考是,

    my $arrayRef = @redArray[$i];
    my @redVal = @{$arrayRef};
    

    【讨论】:

    • 标量以$为前缀,数组以@为前缀。所以,它应该是$redArray[$i]。而且,如果您使用过warningsstrict,您就会被告知这一点。
    • 我正在使用严格和警告。由于我正在使用 ASP 经典网站,因此我没有看到任何错误。你会推荐什么?首先直接在 perl 中完成所有代码,然后将其复制过来?或者有没有办法将错误警告转储到网页上?
    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多