【问题标题】:perl: why are references to anonymous arrays scalar?perl:为什么对匿名数组的引用是标量的?
【发布时间】:2016-03-16 06:22:42
【问题描述】:

我已经 10 多年没有使用 Perl 编程了,所以这对于更有经验的 Perl 程序员来说可能是显而易见的。我搜索了答案,但没有找到任何东西。

我的问题是:为什么对匿名数组的引用是标量的?

例如在下面的代码中:

#!/usr/bin/perl

use strict;
use feature qw(say);

my @array1 = ('one');
say 'array ref 1: ' . \@array1;
my @array2 = ('one', 'two');
say 'array ref 2: ' . \@array2;
say 'array ref 3: ' . \('one');
say 'array ref 4: ' . \('one', 'two');

exit 0;

结果是:

array ref 1: ARRAY(0x1e1b1c0)
array ref 2: ARRAY(0x1e1b190)
array ref 3: SCALAR(0x1e1b280)
array ref 4: SCALAR(0x1e10c40)

为什么数组 ref 3 和数组 ref 4 是标量?

【问题讨论】:

  • 也试试say 'array ref 5: ' . ['one', 'two'];
  • 您的示例中没有匿名数组 :-)
  • 这在Arrays vs. Lists in Perl: What's the Difference?“可以引用数组”下进行了解释。 (我也建议阅读本文的其余部分,因为许多 Perl 程序员没有意识到列表和数组之间的区别。)
  • 谢谢ThisSuitIsBlackNot 我读过那篇关于数组与列表的文章,它清除了一切。

标签: arrays perl reference scalar


【解决方案1】:

所有引用都是标量。当您对引用进行字符串化时,它包括它所引用的类型。这意味着你有一个标量的引用。

[ ] 是构造数组的运算符。 ( ) 不创建任何数组。

你想要

say 'array ref 3: ' . ['one'];
say 'array ref 4: ' . ['one', 'two'];

通常,括号只是改变优先级。如果这里是真的,

\('one', 'two')

相当于

('one', \'two')

这是因为标量上下文中的逗号/列表运算符通常会返回其最后一个表达式的计算结果。但是\(...) 是特殊情况下等效于以下更有用的构造:

(\'one', \'two')

引用枚举列表与使用方括号不同——相反,它与创建引用列表相同!

@list = (\$a, \@b, \%c);
@list = \($a, @b, %c);      # same thing!

也就是说

say 'array ref 4: ' . \('one', 'two');

等价于

say 'array ref 4: ' . (\'one', \'two');

相当于

say 'array ref 4: ' . \'two';

【讨论】:

    【解决方案2】:

    来自perlref

    引用枚举列表与使用方括号不同——相反,它与创建引用列表相同!

    @list = (\$a, \@b, \%c);
    @list = \($a, @b, %c);      # same thing!
    

    您会得到一个标量引用,因为列表中最终将其引用传递给 LHS 的项目是一个标量。

    【讨论】:

      【解决方案3】:

      您似乎认为它们是等价的:

      my @array1 = ('one', 'two');
      my $array2 = \('one', 'two');
      

      但这不是获取匿名数组的正确语法。您需要方括号来创建匿名数组。

      my $array3 = ['one', 'two'];  # a reference to an anonymous array
      my $array4 = \['one', 'two']; # a reference to a reference to an anonymous array
      

      【讨论】:

      • 您可能永远不需要\['one', 'two']
      • @ikegami 我同意你的观点,但问题不是关于实际或实际用例,而是关于语言如何工作,所以我只是为了说明目的而添加了。
      猜你喜欢
      • 2012-05-10
      • 2012-12-19
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2015-03-04
      • 2014-03-16
      • 2011-01-13
      • 1970-01-01
      相关资源
      最近更新 更多