0

我不是 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 如果网上某处有很好的例子说明如何正确使用Spreadsheet,我想知道它们在哪里。

4

1 回答 1

3

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

变量前面的符号告诉你你想要做什么,而不是它是什么类型的变量。A$表示单个项目,$scalar例如$array[0]和对聚合的单个元素访问$hash{$key}。不要使用印记来强制类型。Perl 5 不这样做。

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

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

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

一旦你在标量中有哈希引用,你就可以取消引用它来获取它的值:

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

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

于 2012-04-05T21:43:04.347 回答