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};    

最後から2番目の行でエラーが発生します

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などの集合体への単一の要素アクセスも意味します。タイプを強制するためにシジルを使用しないでください。Perl5はそれを行いません。$array[0]$hash{$key}

あなたの場合、$spreadsheetは配列参照です。名前%spreadsheet付きハッシュである変数は、同じ識別子を持つ他のすべての変数とは無関係の完全に別個の変数です。$foo、、@fooおよび%fooは異なる名前空間から取得されます。を宣言していないため%spreadsheet、strictは表示されるエラーをスローします。

からハッシュ参照を取得したいようです$spreadsheet->[1]。すべての参照はスカラーであるため、スカラーに割り当てる必要があります。

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

スカラーにハッシュ参照を取得したら、それを逆参照して値を取得します。

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

これは、中級Perlの最初の部分で取り上げる内容です。

于 2012-04-05T21:43:04.347 に答える