Почему поведение области видимости по умолчанию в Perl такое, как оно есть?
Я изучаю Perl в школе, и в настоящее время изучаю использование myключевого слова и область видимости в Perl. (Для справки, я смотрел Как мне использовать ключевое слово «my» в Perl?. ) Надеюсь, этот вопрос еще нигде не задавался, но если нет ... почему Perl ведет себя так по умолчанию?
Мне кажется, что область видимости по умолчанию в стиле C имеет наибольший смысл ... вы объявляете переменную внутри блока, переменная существует внутри этого блока, и как только вы покидаете этот блок, эта переменная больше не доступна. Почему в Perl для определения такого поведения необходимо использовать myключевое слово? Кажется, что ограничение области действия переменной только тем местом, где она используется, было бы хорошим стандартным поведением, а постоянное использование myкажется очень избыточным и, как будто, способствует загромождению кода.
Это немного похоже на то, как зайти в продуктовый магазин и сразу же громко объявить предпочитаемый вами бренд того-то и такого-то, прежде чем продолжить покупки, на случай, если кому-то из окружающих будет любопытно (а это, вероятно, не так).
(Возможный дубликат, этот вопрос может быть снят ... Зачем объявлять переменную Perl с "my" в области видимости файла? )
Ответы
Если вам нужны переменные с лексической областью видимости, вам понадобится некоторая форма объявления. [1]
Мне кажется, что область видимости по умолчанию в стиле C имеет наибольший смысл ... вы объявляете переменную внутри блока, переменная существует внутри этого блока, и как только вы покидаете этот блок, эта переменная больше не доступна
Именно так это работает в Perl. Если можно объявить переменную с использованием int iв C, используется my $iв Perl. Оба создают переменную с лексической областью видимости, то есть переменную, которая видна только в текущем блоке и содержит блоки. При выполнении кода вне блока переменная недоступна. Область видимости переменных в Perl такая же, как и область видимости переменных в C. [2]
// Can't use `i` here. # Can't use `$i` here.
{ {
// Can't use `i` here. # Can't use `$i` here. int i = 4; my $i = 4;
printf("%d\n", i); 4 say $i; { { printf("%d\n", i); 4 say $i;
int i = 5; my $i = 5; printf("%d\n", i); 5 say $i;
} }
printf("%d\n", i); 4 say $i; } } // Can't use `i` here. # Can't use `$i` here.
Python не имеет явных объявлений переменных, но также не имеет переменных с лексической областью видимости; Переменные Python привязаны к функциям.
Однако время жизни переменных не то же самое. Скаляр может оставаться активным после конца блока, в котором он находится в Perl, но это не относится к аналогичным переменным в C (переменные с «автоматической продолжительностью хранения»).
Например,
# You can't use `@a` outside of the sub, # But you can use the created array anonymously. sub f { my @a = qw( abc def ); return \@a; }В этом смысле
my $xэто больше похоже на динамически выделяемую структуру.
Потому что именно так это сделал Ларри Уолл в 1987 году, и Perl 5 остается обратно совместимым с этим решением. Лексические переменные не были введены до Perl 5 в 1994 году, и к тому времени уже была довольно большая база для установки программ Perl 4.
Я подумаю, почему. Perl не задумывался как язык приложений, он стал им. Perl 1 был написан в 1987 году как более мощная альтернатива sed , awk и оболочке Bourne .
Если у вас есть проблема, которая обычно связана с использованием sed, awk или sh, но она превышает их возможности или должна работать немного быстрее, и вы не хотите писать глупые вещи на C, тогда perl может быть для вас.
Из руководства Perl 1.0 .
Программы sed и awk обычно занимают одну строку. А в оболочке переменные глобальные. Учитывая назначение Perl 1, это было прекрасно.
Принятые стандарты разработки программного обеспечения сильно изменились за последние несколько десятилетий. Раньше, когда системы были меньше и проще, глобальные переменные были более приемлемыми. По мере роста сложности глобальные переменные становятся все более опасными.
Строго говоря, область видимости переменных по умолчанию в Perl является глобальной для пакета. Переменные, которые не нужно объявлять . Это многое говорит о философии Perl. Он ориентирован на задачи и отличается быстрым прототипированием и быстрым и грязным программированием. Вы можете писать полные программы в командной строке для выполнения довольно сложных задач ( perl -e). Подойдет только мазохист perl -e 'use strict; ...'. Вы просто пишете переменные, и они просто работают. Одна из таких философий - DWIM - делай то, что я имею в виду. Это полная противоположность большинству «жестких» языков программирования, где вы должны определить мир, прежде чем что-либо делать.
Тогда в свое время Ларри мы получили strict, use vars, my, our, и stateзавершить управление переменными. Они работают на нас, а не наоборот. На самом деле, если некоторые данные не помещаются в глобальные переменные, это может считаться грубым программированием. Потому что я не обязательно знаю лучше, чем следующий парень, и если он хочет проанализировать или изменить мой код или модуль, это нормально и по-соседски.
Вот несколько очень поучительных ссылок на выступления Ларри Уолла, создателя Perl.
Perl, первый компьютерный язык постмодерна
Культура Perl
А если серьезно, то если в Perl Culture и есть зародыш важной идеи, то он таков: слишком много контроля так же смертельно опасно, как и слишком мало контроля. Нам нужен контроль и нам нужен хаос.
Программирование - это сложно, давайте приступим к написанию сценариев ...
Разочарование программирования оболочки Unix привело непосредственно к созданию Perl. Я обнаружил, что сценарии оболочки были внутренне ограничены тем фактом, что большинство его глаголов не находятся под его контролем, а существительные обеднены, ограничены строками и файлами, с неизвестной типологией. Я не хочу говорить на глупом компьютерном языке. Я хочу, чтобы мой компьютерный язык понимал строки, которые я набираю.
Для получения дополнительной информации посетите perl.com