【问题标题】:perl autovivification of arrayperl 数组的自动激活
【发布时间】:2016-07-19 00:11:36
【问题描述】:

我正在阅读伦敦的“不耐烦的 perl”。我正在测试“参考”一章中的一个示例。我想知道为什么在引用的自动激活中我需要在 [] 中放置一个数字(任何数字),而在声明一个数组时,我可以只使用 [] 作为空数组。谢谢。

#!/usr/bin/env perl
use warnings;
use strict;
use Data::Dumper;

my $scal;
my $val = $scal->[2]->{somekey}->[1]->{otherkey}->[7]; 
# fails if [] instead of [7] or [1] or [99999];
# same result if [7] or [1] or [99999] is used;

$val->[3] = 19;

print Dumper $scal;
print "========\n";
print Dumper $val;
print "========\n";
print Dumper []; # this does not fail; 

错误消息是“referenceTest.pl 第 7 行的语法错误,靠近“[]” 全局符号“$val”需要在 referenceTest.pl 第 15 行显示明确的包名称。由于编译错误,referenceTest.pl 的执行被中止。”

================== 当它使用 [7] 工作时,结果是:

$VAR1 = [
          undef,
          undef,
          {
            'somekey' => [
                           undef,
                           {
                             'otherkey' => []
                           }
                         ]
          }
        ];
========
$VAR1 = [
          undef,
          undef,
          undef,
          19
        ];
========
$VAR1 = [];

谢谢你启发我。

【问题讨论】:

  • 这里[]有两种用法。 $scal->[2] 进行数组索引查找。 [] 创建对匿名数组的引用。

标签: arrays perl autovivification


【解决方案1】:

->[] 正在寻址一个数组条目。当然,你需要一个索引。自动生存只是寻址不存在的东西的副作用。如果你想赋值,那么,正如 Captain Obvious 很容易建议的那样,使用赋值运算符 =: my $val = ($scal->[2]->{somekey}->[1]->{otherkey} = []);

【讨论】:

    【解决方案2】:

    这里很好地解释了自动生存http://perlmaven.com/autovivification

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-29
      • 2015-03-11
      • 2020-11-24
      • 2023-03-28
      • 2011-05-17
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多