【问题标题】:Why $-reference possible to Perl array? [duplicate]为什么 $-reference 可能对 Perl 数组? [复制]
【发布时间】:2015-05-14 22:56:13
【问题描述】:

我正在考虑如何通过符号$ 引用 Perl 数组中的元素。

最低代码

my @x = @{ $_[0] }; 

for(my $i=0; $i<$#x; $i++){
    print $x[$i]; 
} 

您将数组初始化为@x,这是一个数组。 您在 for 循环中通过 $x[$i] 打印出数组中的每个项目。

我认为当您通过@x 初始化数组并通过$#x 获取其大小时,这有点令人困惑。

为什么$x可以引用Perl数组?

【问题讨论】:

  • $#xNOT 数组的大小。它是数组最后一个元素的索引。数组的大小是 @x 在标量上下文中评估。另外,my $x = shift; print $x-&gt;[$_] for 0 .. $#$x; 打印数组的元素而不创建副本。
  • @SinanÜnür 所以索引可以是 Perl 中的标量以外的东西。对吗?
  • 索引强加标量上下文。当您编写 $ary[ ... ] 时,[ ] 之间的任何内容都会在标量上下文中进行评估。例如,由于自动激活,$ary[ @ary ]始终undef。在 C 中,它会访问越界的内存位置并导致未定义的行为。
  • @SinanÜnür 所以$#x应该通过数组的最后一个元素对应数组的大小。任何情况下编号之间的差距?可能吗?
  • $#x 是最后一个索引 --- 不是数组的大小。我不知道这可以说得清楚多少。

标签: arrays perl


【解决方案1】:

因为错误的方式是让符号表示您正在使用的事物的类型,而不是成为变量名称的一部分。

$x 是一个标量,与@x 列表无关。 然而$x[1] 仍然是一个标量 - 但它是一个元素来自列表@x。 (并且与$x 无关,因为很明显 - 您无法从单个元素中选择单个元素)。

$#x 是单个值(标量),所以 $ 前缀仍然存在。

这同样适用于哈希。 %hash 是整个哈希。 $hash{$key} 是来自该哈希的单个值。 @hash{@some_keys} 是来自该哈希值的列表。

【讨论】:

    【解决方案2】:

    您不是用$x 引用数组,而是用它引用数组的一个元素。您的数组是一个 标量 值数组,您可以使用 $ 访问它们。

    请参阅perlintroperldata 文档。它将涵盖您问题的“为什么”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      相关资源
      最近更新 更多