我是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..** }
答案 0 :(得分:3)
您正在使用@headers
将\@headers
数组引用到$header_copy
。因此,在访问它之前,您需要取消引用它。
它有两种方式(实际上不止于此):
Arrow operator(->)
- 最适合从arrayref @ { }
- 适合迭代arrayrefs。 $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