В Perl есть две совершенно разные, но в значительной степени совместимые системы переменных, переменные пакета, как в первом примере, и лексические переменные, как во втором. Есть несколько вещей, которые каждый может сделать, но другой не может:
Переменные пакета - единственные, которые могут быть:
- локализовано (с
local
)
- используется в качестве цели для символической ссылки (причина, по которой второй пример OP не работает)
- используется как голые слова (подопределения, дескрипторы файлов)
- используется с typeglobs (потому что это то, что символ на самом деле находится под капотом)
Лексические переменные - единственные, которые могут быть закрыты (используются в лексическом закрытии).
Использование строгого режима поможет вам объявить переменные пакета с помощью our
, что сделает разницу более ясной.
Есть несколько случаев, когда символические ссылки полезны в Perl, большинство из которых сосредоточено на манипулировании таблицей символов (например, написание собственного import
в модуле, а не на использовании Exporter
, модули обезьяноподготовки во время выполнения, различные другие мета программирование задач). Все это сложные темы.
Для других задач обычно есть лучший способ сделать это, например, с помощью хэша. Основное правило: всегда запускать под use warnings; use strict;
, если только вы не знаете, что другого выхода нет, кроме как отключить часть прагмы (например, использовать no strict 'refs';
в как можно меньшем объеме).