perl 101 - " @"对于数组或哈希

时间:2012-08-27 03:57:04

标签: perl


 foreach (@v) { s/^\s+//; s/\s+$// }
        push @{$data[$x]}, @v;
      }
我收到一个错误:全局变量@data需要显式包名 - 不知道如何添加“我的”。

但我也不明白这行代码,

  • 它将v元素推入数据[x]。但是@如何工作。我知道{}用于哈希。

2 个答案:

答案 0 :(得分:4)

my声明了词法范围的变量。这似乎不合适,因为似乎没有新变量被命名,除非@data是新的,在这种情况下my必须移动:

push @{(my @data)[$x]}, @v;
由于@data的词汇范围立即消失,或者更清晰有效地消失,因此

主要是无用的:

my @data;
push @{$data[$x]}, @v;

其中@data的范围稍大。


perlreftut解释@{...}。没有my

push @{$data[$x]}, @v;

表示获取$x数组的@data元素,将其视为数组引用,并将@v附加到其中。

例如,

my @data = (
    [],          # 0
    ['a'],       # 1
    ['b'],       # 2
    ['c', 'd'],  # 3
);
my $x = 2;
my @v = ('e', 'f');

push @{$data[$x]}, @v;
# @data = (
#     [],               # 0
#     ['a'],            # 1
#     ['b', 'e', 'f'],  # 2
#     ['c', 'd'],       # 3
# );

答案 1 :(得分:1)

您是否在尝试定义@data的同时进行推广?在没有更多信息的情况下,my的含义尚不清楚。

@{}包装器说“大括号内的东西是一个arrayref,所以现在把它当作一个真正的数组”。 push命令应该将@v数组的所有元素复制到$x数组的@data元素上,该元素应该是数组引用。