2012-04-05 4 views
0

Ich bin kein Experte in Perl, fragt, warum der erste Weg numSheets zu erhalten, in Ordnung ist, während die folgende Art und Weise ist nicht:Fehler Zwischenvariable mit Tabellenkalkulations zuzugreifen :: Lese Blätter

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

Die nächste bis letzte Zeile gibt den Fehler

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

Ich bin mir ziemlich sicher, dass ich die richtigen Sigillen habe; Wenn ich experimentiere, kann ich nur verschiedene Fehler bekommen. Ich weiß, Tabellenkalkulation ist eine Referenz auf ein Array nicht direkt ein Array. Ich weiß nicht über den Hash für die Metadaten oder einzelne Blätter, aber das Experimentieren mit anderen Annahmen führt nirgends (zumindest mit meinem bescheidenen Perl-Fähigkeit.)

Meine Referenz auf Tabellenkalkulation :: Read Workings ist http://search.cpan.org/perldoc?Spreadsheet::Read Wenn es gut sind Beispiele irgendwo online, die zeigen, wie Spreadsheet richtig zu verwenden, würde ich gerne wissen, wo sie sind.

Antwort

3

Es ist nicht in Ordnung, weil es keine gültige Perl-Syntax ist. Das liegt daran, dass Larry seine Sprache nicht so definiert hat.

Die Sigillen vor Variablen sagen Ihnen, was Sie versuchen zu tun, nicht welche Art von Variable es ist. A $ bedeutet Einzelartikel, wie in $scalar, aber auch Einzelelementzugriffe auf Aggregate wie $array[0] und $hash{$key}. Verwenden Sie nicht die Sigillen, um Typen zu erzwingen. Perl 5 macht das nicht.

In Ihrem Fall ist $spreadsheet eine Array-Referenz. Die Variable %spreadsheet, bei der es sich um einen benannten Hash handelt, ist eine vollständig separate Variable, die nicht mit allen anderen Variablen mit demselben Bezeichner verknüpft ist. $foo, @foo und %foo stammen aus verschiedenen Namespaces. Da Sie keine %spreadsheet deklariert haben, strict strict den Fehler, den Sie sehen.

Es sieht so aus, als ob Sie eine Hash-Referenz von $spreadsheet->[1] erhalten möchten. Alle Verweise sind Skalare, so dass Sie wollen auf einen Skalar zuweisen:

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

Sobald Sie den Hash-Referenz in der Skalar haben Sie dereferenzieren es seine Werte erhalten:

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

Das ist der Stoff Wir decken im ersten Teil von Intermediate Perl.

+0

Aha, also bin ich ein Anfänger, der versucht, Zwischentricks zu machen :) – DarenW

+0

Es funktioniert, und nach dem Re-Lesen von Sachen, die ich bereits in den letzten Tagen gelesen hatte, macht das jetzt Sinn (irgendwie). Dennoch scheint die Quantenfeldtheorie viel einfacher zu sein als Perl ... – DarenW