【问题标题】:Perl - Array reference, using strictPerl - 数组引用,使用严格
【发布时间】:2011-10-26 17:53:50
【问题描述】:

我有以下代码:

my @array = ('a', 'b', 'c');

my $region = \@array;  # Returns an array reference
my $Value = ${@{$region}}[3];   

我使用的是严格的;

这段代码在 Perl v5.8.6 中顺利通过,现在我安装了 v5.10.1,出现运行时错误:

不能将字符串 ("4") 用作 ARRAY 引用,而 "strict refs" 用于 ...

我将代码更改为以下,这解决了问题:

my @array = ('a', 'b', 'c');

my $region = \@Array;
my @List = @{$region};
my $Value = $List[3];   

我的问题是,以前的方式有什么问题?这两个版本之间有什么变化? 我在这里错过了什么?

谢谢, 加尔

【问题讨论】:

  • 另外我认为问题是......您的区域包含 4 个元素,而不是在返回 4 的列表上下文中评估 @{$region} 并且您的调用变为: $Value = ${ '4'}[3] 产生错误
  • 为什么要一直引用代码中长度为三个元素的列表中的第 4 个元素?

标签: arrays perl reference strict


【解决方案1】:

我会这样做:

my @array = ('a', 'b', 'c');
my $region = \@array;
my $Value = $$region[1];
print $Value;

输出:

b

【讨论】:

  • 为什么这会被否决?这是一个完全有效的方法。
【解决方案2】:

${@{$region}}[3] 从来都不是访问 arrayref 的正确方法。我不太确定它是什么意思,我认为 Perl 也不是(因此在不同版本的 Perl 中行为不同)。

正确方法在perlref中解释:

my $Value = ${$region}[3]; # This works with any expression returning an arrayref
my $Value = $$region[3];   # Since $region is a simple scalar variable,
                           # the braces are optional
my $Value = $region->[3];  # This is the way I would do it

【讨论】:

  • 新行为正确; $ 之后的块应该得到标量上下文。较旧的 perl 版本会错误地将数组提升为数组引用。但我认为这正在经历一个弃用周期 - 看起来这是为 @array->[] 而不是 ${@array}[] :(
  • ${ @{$region} }[3]${ scalar(@{$region}) }[3]。它相当于$0[3]$1[3]$2[3] 或类似的,具体取决于@$region 中的元素数量。
  • @Jared Ng,所有 3?只介绍了两种方式。如果您考虑添加括号,那么对于初学者来说,远远不止 3 个。${$region}[3]${region}->[3]($region)->[3]
  • @ysth,那些卷曲不会形成一个块。
  • @ysth,据我所知,${@array}[] 没有得到弃用周期,因为它总是正常工作。 (在 5.10 中工作,不再有 5.8)@array->[] 在 5.12 中被弃用并在 5.14 中修复。
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2019-03-01
  • 2014-07-27
  • 2020-05-22
相关资源
最近更新 更多