【问题标题】:In Perl, what is the difference between accessing an array element using @a[$i] as opposed to using $a[$i]?在 Perl 中,使用 @a[$i] 和使用 $a[$i] 访问数组元素有什么区别?
【发布时间】:2013-03-21 12:01:44
【问题描述】:

我遵循的基本语法教程没有说明这一点:

使用前一个或后一个下标符号访问数组之间是否有任何实际/哲学/上下文相关/棘手的区别?

$ perl -le 'my @a = qw(io tu egli);打印 $a[1], @a[1]'

两种情况下的输出似乎相同。

【问题讨论】:

    标签: perl syntax


    【解决方案1】:
    $a[...]   # array element
    

    返回由索引表达式标识的一个元素,并且

    @a[...]   # array slice
    

    返回由索引表达式标识的所有元素。

    因此,

    • 当您打算访问单个元素以便将此信息传达给读者时,您应该使用$a[EXPR]。事实上,如果您不这样做,您可能会收到警告。
    • 当您要访问多个元素或可变数量的元素时,您应该使用@a[LIST]

    但这不是故事的结局。您询问了实际和棘手(微妙?)的差异,但没有人提到:数组元素的索引表达式是在标量上下文中计算的,而数组切片的索引表达式是在列表上下文中计算的。

    sub f { return @_; }
    
    $a[ f(4,5,6) ]     # Same as $a[3]
    @a[ f(4,5,6) ]     # Same as $a[4],$a[5],$a[6]
    

    【讨论】:

    • 底部是尚未提及的差异。
    • 切换答案。你的把它带到.. 11!
    【解决方案2】:

    如果您打开warnings(您总是应该这样做),您会看到:

    标量值@a[0] 最好写成$a[0]

    当您使用@a[1] 时。

    @ sigil 的意思是“给我一份清单”。当与数组下标一起使用时,它检索数组的一个切片。例如,@foo[0..3] 检索数组 @foo 中的前四项。

    当您编写 @a[1] 时,您是在请求来自 @a 的单元素切片。这完全没问题,但是要求一个值$a[1] 会更清楚。如此之多,以至于如果您以第一种方式执行此操作,Perl 会警告您。

    【讨论】:

      【解决方案3】:

      第一个产生一个标量变量,而第二个给你一个数组切片......非常不同的动物!!

      【讨论】:

      • 实际上,$a[1] 形式产生的是一个标量值,而不是一个变量。
      猜你喜欢
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 2012-10-20
      • 2011-02-03
      • 2011-03-21
      • 2021-08-25
      相关资源
      最近更新 更多