2016-07-28 15 views
-1

Ich hatte eine harte Zeit, diese Frage zu titeln, da ich wirklich ratlos bin, was diesen Fehler verursachen könnte.Perl MindMelting nicht initialisierte Variable in Skalar von Array-Ausnahme

, wenn ich den Code haben als solche eingegeben:

my @strArray= ('TypeKey', 'AccidentType', '01'); 
my %HashArrayThing = ('EnglishArray' => @strArray, 
     'FrenchArray' => ('julier', 'aout', 'septembre')); 
my $scalar = @HashArrayThing{EnglishArray}; 
my @ARR = @HashArrayThing{EnglishArray}; 
say $scalar, 
say $ARR[0]; 

der Ausgang ist:

TypeKey 
TypeKey1 

, wenn ich nur ändern, die say $ARR[0]-say $ARR[1] (oder eine andere Nummer) erhalte ich die Fehlermeldung: "Nicht initialisierter Wert in etwa in Zeile 50" (gleiche Zeile wie der 'say $ Skalar')

Das macht für mich keinen Sinn. Ich könnte verstehen, dass die $ ARR [1] außerhalb der Grenzen liegen könnte, vielleicht hat man den ersten Wert aus dem im Hash-Set gespeicherten Array bekommen, aber ich verstehe überhaupt nicht, woher das kommt. Ich hoffe, da ist jemand mit einem tiefen Verständnis von Perl, das mich erleuchten kann.

PS. auch wo ist der '1'coming von diesem ist bieng typkey hinzugefügt.

Antwort

2

Diese Zeile:

my %HashArrayThing = ('EnglishArray' => @strArray, 
    'FrenchArray' => ('julier', 'aout', 'septembre')); 

schafft tatsächlich diese Struktur:

(
     'AccidentType' => '01', 
     'FrenchArray' => 'julier', 
     'EnglishArray' => 'TypeKey', 
     'aout' => 'septembre' 
) 

wo ich mir vorstellen, Sie erwarten:

(
     'FrenchArray' => ['julier', 'aout', 'septembre'], 
     'EnglishArray' => ['TypeKey', 'AccidentType', '01'], 
) 

Dies geschieht, weil der Wert von ein Schlüssel/Wert-Paar in einem Hash muss ein SCALAR sein. Es ist also ein einfacher Wert wie eine Zahl oder ein String oder eine Referenz Hash oder ein Array.

Im Folgenden ist der richtige Weg, um Ihre Hash zu initialisieren:

my %HashArrayThing = (
    'EnglishArray' => [@strArray], 
    'FrenchArray' => ['julier', 'aout', 'septembre'] 
); 

Beachten Sie, dass die Arrays Sie zuvor bestanden jetzt in [] gewickelt sind, die eine Referenz auf ein Array erzeugt.

1

Ein Hash-Paar key => value muss Skalare für key und value haben. Ein Array für beide zu haben macht keinen Sinn.

Hash ist eine Liste mit einer geraden Anzahl von Elementen, in denen jedes Paar aus zwei aufeinanderfolgenden Elementen ein Schlüssel/Wert-Paar bildet. Zum Beispiel sind die folgenden beiden Hashes genau das gleiche

my %h1 = ('one', 1, 'two', 2); # $h1{'one'} --> 1 
my %h2 = (one => 1, two => 2); # same 

Das Fett Komma=> ein synonym for a comma ist das auch eine Bareword stellt seinen zitierte links.

Also, wenn Sie

my %HashArrayThing = ('EnglishArray' => @strArray, 
    'FrenchArray' => ('julier', 'aout', 'septembre')); 

die ganze Liste sagen wird abgeflacht und Sie zu einer % Variable %HashArrayThing die folgenden Liste

('EnglishArray', 'TypeKey', 'AccidentType', '01', 
'FrenchArray', 'julier', 'aout', 'septembre') 

Being zugewiesen zuweisen diesen ist einen Hash, mit der lustige (unbeabsichtigte) Paarung von aufeinanderfolgenden Elementen in Schlüssel-Wert-Paaren - so EnglishArray ist ein Schlüssel und sein Wert ist TypeKey, usw. Das heißt, wenn die Anzahl der e lements passiert gerade. Wenn die Zahl ungerade ist, erhalten Sie die Warnung - aber Sie erhalten immer noch den Hash. Behalte deine Warnungen wie immer.


Für Arrays in eine Hash-Verpackung Sie Referenzen verwenden müssen,

my %HashArrayThing = ('EnglishArray' => \@strArray, 
    'FrenchArray' => ['julier', 'aout', 'septembre']); 

Beachten Sie, dass \@ die Referenz eines vorhandenen Arrays erfolgt, also wenn die @strArray Änderungen später, die in der Hash-reflektiert wird . Auf der anderen Seite erstellt die [...] eine anonyme Array, Kopieren der aufgeführten Werte. Was für den jeweiligen Zweck besser geeignet ist, hängt davon ab, was Ihr Code damit macht.

Dann greifen Sie Elemente von Dereferenzierung, zum Beispiel

$HashArrayThing{'EnglishArray'}->[0]; # is 'TypeKey' 
$HashArrayThing{'FrenchArray'}->[0]; # is 'julier' 

Für Referenzen siehe perlreftut und perlref, während perldsc ein einfaches Kochbuch von komplexen (verschachtelten) Datenstrukturen sind.