Perl数组引用反转

时间:2016-08-08 07:27:19

标签: arrays perl

我是perl的新手。并且一直在使用CSV文件,JSON字符串,数组和哈希。

我已编写此代码,但它给了我错误。我想在foreach循环中使用$header_copy

    1. my @headers=qw/January February March April May June/;
    2. my $header_copy=\@headers;
    3. print("$header_copy->[2]");  # Prints "March" Correctly
    4. print("$header_copy[2]");    #Gives Error.

错误:

  

全局符号“@header_copy”需要第4行显式的包名称

我想在for循环中使用$ header_copy:like:

foreach $i ($header_copy){ **code..** }

4 个答案:

答案 0 :(得分:3)

您正在使用@headers\@headers数组引用到$header_copy。因此,在访问它之前,您需要取消引用它。

它有两种方式(实际上不止于此):

  1. 使用Arrow operator(->) - 最适合从arrayref
  2. 访问单个项目
  3. 使用@ { } - 适合迭代arrayrefs。
  4. $header_copy[2]会出错,因为您从arrayref访问元素而不解除引用它。解释器将其假定为数组@header_copy而不是arrayref,因为语法说明了它。

    以下程序总结了两种方法:

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    # define @ headers
    my @headers = qw/January February March April May June/;
    
    # taken refrence of @headers array into $header_copy
    my $header_copy = \@headers;
    
    # dereferencing using arrow(->) operator
    print $header_copy -> [2],"\n"; 
    
    # derefrencing for iteration using @{...}
    foreach(@{ $header_copy }) {
        print $_,"\n";
    }
    

答案 1 :(得分:1)

错误'全局符号" ..."需要明确的包名称'是Perl代表"您正在尝试使用未声明的变量"。它甚至会告诉你未声明的变量的名称 - 在这种情况下它是@header_copy

如果您查看代码,您将看到没有声明@header_copy数组的声明。哦,你有一个名为$header_copy的标量变量。它包含对数组的引用(数组@headers)。但是这与名为@header_copy的数组无关。

那为什么Perl认为你想使用数组@header_copy?在代码的最后一行,您使用$header_copy[2] - 这意味着"数组@header_copy"中的第三个元素。这会产生错误,因为(正如我已经指出的那样)你没有那个数组。

在上一行中,您使用$header_copy->[2]。这样可以正常工作,因为->[...]是查找您引用的数组中元素的正确方法。

要认识到的重要一点是$header_copy->[2]$header_copy[2]意味着两个完全不同的东西,并且指的是两个完全不同的变量。

您还会问如何返回到您引用的数组(这称为"解除引用")。这很简单。一般来说,你使用:

@{ expression that returns an array reference }

所以,在你的情况下,那将是:

@{ $header_copy }

但是在你的表达式是标量变量的情况下,可以通过省略大括号来简化它,因此它变为:

@$header_copy

所以你想要:

foreach my $i (@$header_copy) {
    ...
}

答案 2 :(得分:0)

# reads data
my @headers=qw/January February March April May June/;

# use a foreach loop and store local copy of item nr in $headeritem_copy
foreach my $headeritem_copy (@headers) {
    print("$headeritem_copy\n");
}

答案 3 :(得分:0)

DataView

取消引用特定索引

my @headers=qw/January February March April May June/;
my $header_copy=\@headers;
print("$header_copy->[2]");  # Prints "March" Correctly