【问题标题】:Multidimensional array access/(de)referencing [duplicate]多维数组访问/(取消)引用
【发布时间】:2013-04-28 12:59:56
【问题描述】:

所以,我正在试验多维数组,并意识到我可以以不同的方式访问它们,但完成相同的任务(见下面的代码)。当使用严格/警告时,Perl 告诉我不应该使用 cmets 中由 ** 表示的形式。

use strict;
use warnings;

my @a=();

push @a, [([1,1,1])];
push @a, [([2,2,2],[2,2,2])];
push @a, [([3,3,3],[3,3,3],[3,3,3])];
push @a, [([4],[4,4,4],[4,4,4],[4,4,4],[4,4,4],[4,4,4])];

print scalar(@a)."\n"; #Prints Size of outer array == 4

print scalar(@{@a[3]})."\n"; #Prints number of arrays in slot 3 of @a == 6 **
#or alternatively
print scalar(@{$a[3]})."\n"; #Prints number of arrays in slot 3 of @a == 6 

print scalar(@{@{@a[3]}[0]})."\n"; #Prints size of array in @a of (3,0) == 1  **
#or alternatively
print scalar(@{$a[3][0]}); #Prints size of array in @a of (3,0) == 1 

上面的两个例子在功能上真的有区别吗?为什么带**的行比其他行差?仅仅是因为他们比他们的同行更令人困惑吗?

提前致谢。

【问题讨论】:

    标签: perl


    【解决方案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]
    

    【讨论】:

      【解决方案2】:

      此特定问题与引用或取消引用无关。您可以使用语法 $a[n] 获得数组 @a 的第 n 个元素。这是受英语的启发(“这些”元素中的“这个”元素)。

      @a[] 用于获取数组切片,例如@a[0,1,2];

      【讨论】:

        猜你喜欢
        • 2021-09-07
        • 2018-02-25
        • 1970-01-01
        • 2017-05-10
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多