我不是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如果在线某处有很好的例子说明如何正确使用电子表格,我想知道它们在哪里。
答案 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 的第一部分中介绍的内容。