使用中间变量访问Spreadsheet :: Read表时出错

时间:2012-04-05 21:41:30

标签: perl compiler-errors hashmap perl-module

我不是Perl的专家,想知道为什么获得numSheets的第一种方法是可以的,而以下方法不是:

use Spreadsheet::Read;
my $spreadsheet = ReadData("blah.xls");
my $n1 = $spreadsheet->[1]{sheets};     # okay
my %sh = %spreadsheet->[1];             # bad
my $n2 = $sh{label};    

倒数第二行给出错误

Global symbol "%spreadsheet" requires explicit package name at newexcel_display.pl line xxx

我很确定我有正确的印记;如果我实验,我只能得到不同的错误。我知道电子表格是对数组的引用而不是直接数组。我不知道元数据或单个表格的哈希,但尝试不同的假设无处可去(至少我的适度perl技能。)

我对Spreadsheet :: Read工作的参考是http://search.cpan.org/perldoc?Spreadsheet::Read如果在线某处有很好的例子说明如何正确使用电子表格,我想知道它们在哪里。

1 个答案:

答案 0 :(得分:3)

这不好,因为它不是有效的Perl语法。原因是拉里定义他的语言不是这样的。

变量前面的印记告诉你你要做什么,而不是它是什么类型的变量。 $表示单个项目,如$scalar,但也包含对$array[0]$hash{$key}等聚合的单个元素访问。不要使用这些印​​记来强制改变类型。 Perl 5不这样做。

在您的情况下,$spreadsheet是一个数组引用。 %spreadsheet变量是一个命名散列,是一个完全独立的变量,与具有相同标识符的所有其他变量无关。 $foo@foo%foo来自不同的命名空间。由于您尚未声明%spreadsheet,因此strict会抛出您看到的错误。

看起来您想要从$spreadsheet->[1]获取哈希引用。所有引用都是标量,因此您要分配标量:

 my $hash_ref = $spreadsheet->[1];

在标量中有哈希引用后,您可以取消引用它以获取其值:

 my $n2 = $hash_ref->{sheets};

这是我们在 Intermediate Perl 的第一部分中介绍的内容。