Perl posiada dwa całkowicie odrębne, ale w dużej mierze kompatybilne systemy zmienne, zmienne opakowaniu, jak w pierwszym przykładzie, i leksykalne zmienne, tak jak w drugim. Jest kilka rzeczy, które każdy może zrobić, ale z drugiej strony nie mogę:
zmienne opakowania są jedynymi, które mogą być:
- zlokalizowaną (z
local
)
- użyte jako cel dla symbolicznym odniesieniem (powód drugi przykład praca robi pO za)
- stosowany jako gołe słowa (definicje sub, uchwyty plików)
- stosować Typeglob (bo to właśnie symbol naprawdę jest pod maską)
Zmienne leksykalne są jedynymi, które można zamknąć (używane w zamknięciu leksykalnym).
Korzystanie ze ścisłej pomocy pomogłoby Ci zadeklarować zmienne pakietu za pomocą our
, dzięki czemu różnica jest większa.
Istnieje kilka razy, gdzie odniesienia symboliczne są użyteczne w Perlu, najczęściej koncentrują się wokół manipulacji tablicę symboli (jak pisanie własnego import
w module zamiast używać Exporter
, małpa-łatanie modułów przy starcie, różne inne zadania meta-programowania). Wszystko to są zaawansowane tematy.
W przypadku innych zadań zwykle jest lepszy sposób na zrobienie tego, na przykład za pomocą skrótu. Ogólna zasada polega na tym, aby zawsze uruchamiać pod numerem use warnings; use strict;
, chyba że nie ma innego sposobu niż wyłączenie części pragmy (np. Użycie no strict 'refs';
w jak najmniejszym zakresie).
Zgaduję, że $ odpowiedź definiuje zasięg globalny, a moja $ odpowiedź definiuje zasięg lokalny. –
@Paul, ale print $ answer będzie działał dobrze ... w jaki sposób $ {$ variable} tworzy zasięg globalny? – ennuikiller
Zawsze używaj 'use strict; użyj ostrzeżenia; 'i nigdy nie zobaczysz tego problemu. Co więcej, nigdy nie używaj wartości zmiennej do uzyskania innej zmiennej. Hashe są znacznie lepsze. – Ether