Использование local
для переменной означает, что ее предыдущее состояние необходимо перенести в стек где-нибудь и восстановить снова при выходе из локальной области. Использование my
для переменной просто создает совершенно новую переменную, которая затеняет предыдущую переменную с тем же именем - предыдущая полностью не затрагивается, и ее не нужно нигде сохранять. Он просто подстерегает при выходе из локальной области видимости и снова становится видимым.
Это выталкивание / выталкивание в стек требует ресурсов; под капотом много работы, чтобы убедиться, что это работает правильно. (Рассмотрим такие случаи, как исключение, возникающее в локальной области видимости, или выполняемый обработчик сигнала. Я уверен, что вы можете придумать еще.)
Помимо большей эффективности, использование my
гораздо более логично. Как программист, представляющий локальную переменную $ foo, вам не нужно беспокоиться о семантической причине предыдущей версии $ foo, о том, какие данные могут быть в ней, или даже если было a $ фу уже создан. Если когда-нибудь в будущем более раннее объявление $ foo будет удалено, ваш код local $foo
сломается, но my $foo
будет совершенно счастлив. Будьте хорошим программистом и храните ваш код в хорошо инкапсулированных частях, что означает использование лексической области видимости как можно больше. Вполне возможно написать большое приложение и ему вообще не нужны переменные пакета / глобальной области видимости, особенно если вы используете хорошо спроектированные классы OO.