Perl hat zwei völlig getrennte, aber weitgehend kompatibel variable Systeme, Paketgrößen, wie in Ihrem ersten Beispiel und lexikalische Variablen, wie in der zweiten. Es gibt ein paar Dinge, die jeder tun kann, aber die andere kippen:
Paketgrößen sind die einzige, das sein kann:
- lokalisierte (mit
local
)
- als Ziel für eine symbolische Referenz verwendet (der Grund, das zweite Beispiel nicht funktioniert das OP)
- als Barewords verwendet (Unter Definitionen, Datei-Handles)
- mit Typeglobs verwendet (weil das ist, was das Symbol wirklich unter der Haube ist)
Lexikalische Variablen sind die einzigen, die geschlossen werden können (in einem lexikalischen Abschluss).
Die Verwendung von strict würde helfen, indem Sie gezwungen werden, Paketvariablen mit our
zu deklarieren, was den Unterschied deutlicher macht.
Es gibt mehrere Zeiten, in denen symbolischen Referenzen nützlich sind in Perl, die meisten drehen sich um die Symboltabelle Manipulation (wie Ihre eigenen import
in einem Modul zu schreiben anstatt Exporter
, Affe-Patchen Module zur Laufzeit, verschiedene andere Meta-Programmieraufgaben). All dies sind fortgeschrittene Themen.
Für andere Aufgaben gibt es normalerweise einen besseren Weg, wie mit einem Hash zu tun. Die allgemeine Faustregel lautet, immer unter use warnings; use strict;
zu laufen, es sei denn, Sie wissen, dass es keinen anderen Weg gibt, als einen Teil des Pragmas zu deaktivieren (z. B. no strict 'refs';
in einem möglichst kleinen Umfang zu verwenden).
Ich vermute, dass $ Antwort einen globalen Bereich definiert, und meine $ Antwort definiert einen lokalen Bereich. –
@Paul, aber print $ answer würde funktionieren ... Wie erstellt $ {$ variable} einen globalen Bereich? – ennuikiller
Verwenden Sie immer 'use strict; Verwenden Sie Warnungen; 'und Sie werden dieses Problem nie sehen. Noch besser: Verwenden Sie niemals den Wert einer Variablen, um eine andere Variable zu erhalten. Hashes sind viel besser. – Ether