Почему поведение области видимости по умолчанию в Perl такое, как оно есть?

Dec 10 2020

Я изучаю Perl в школе, и в настоящее время изучаю использование myключевого слова и область видимости в Perl. (Для справки, я смотрел Как мне использовать ключевое слово «my» в Perl?. ) Надеюсь, этот вопрос еще нигде не задавался, но если нет ... почему Perl ведет себя так по умолчанию?

Мне кажется, что область видимости по умолчанию в стиле C имеет наибольший смысл ... вы объявляете переменную внутри блока, переменная существует внутри этого блока, и как только вы покидаете этот блок, эта переменная больше не доступна. Почему в Perl для определения такого поведения необходимо использовать myключевое слово? Кажется, что ограничение области действия переменной только тем местом, где она используется, было бы хорошим стандартным поведением, а постоянное использование myкажется очень избыточным и, как будто, способствует загромождению кода.

Это немного похоже на то, как зайти в продуктовый магазин и сразу же громко объявить предпочитаемый вами бренд того-то и такого-то, прежде чем продолжить покупки, на случай, если кому-то из окружающих будет любопытно (а это, вероятно, не так).

(Возможный дубликат, этот вопрос может быть снят ... Зачем объявлять переменную Perl с "my" в области видимости файла? )

Ответы

9 ikegami Dec 10 2020 at 06:30

Если вам нужны переменные с лексической областью видимости, вам понадобится некоторая форма объявления. [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.

  1. Python не имеет явных объявлений переменных, но также не имеет переменных с лексической областью видимости; Переменные Python привязаны к функциям.

  2. Однако время жизни переменных не то же самое. Скаляр может оставаться активным после конца блока, в котором он находится в 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это больше похоже на динамически выделяемую структуру.

6 Schwern Dec 10 2020 at 07:00

Потому что именно так это сделал Ларри Уолл в 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, это было прекрасно.

Принятые стандарты разработки программного обеспечения сильно изменились за последние несколько десятилетий. Раньше, когда системы были меньше и проще, глобальные переменные были более приемлемыми. По мере роста сложности глобальные переменные становятся все более опасными.

1 lordadmira Dec 12 2020 at 11:15

Строго говоря, область видимости переменных по умолчанию в Perl является глобальной для пакета. Переменные, которые не нужно объявлять . Это многое говорит о философии Perl. Он ориентирован на задачи и отличается быстрым прототипированием и быстрым и грязным программированием. Вы можете писать полные программы в командной строке для выполнения довольно сложных задач ( perl -e). Подойдет только мазохист perl -e 'use strict; ...'. Вы просто пишете переменные, и они просто работают. Одна из таких философий - DWIM - делай то, что я имею в виду. Это полная противоположность большинству «жестких» языков программирования, где вы должны определить мир, прежде чем что-либо делать.

Тогда в свое время Ларри мы получили strict, use vars, my, our, и stateзавершить управление переменными. Они работают на нас, а не наоборот. На самом деле, если некоторые данные не помещаются в глобальные переменные, это может считаться грубым программированием. Потому что я не обязательно знаю лучше, чем следующий парень, и если он хочет проанализировать или изменить мой код или модуль, это нормально и по-соседски.

Вот несколько очень поучительных ссылок на выступления Ларри Уолла, создателя Perl.

Perl, первый компьютерный язык постмодерна

Культура Perl

А если серьезно, то если в Perl Culture и есть зародыш важной идеи, то он таков: слишком много контроля так же смертельно опасно, как и слишком мало контроля. Нам нужен контроль и нам нужен хаос.

Программирование - это сложно, давайте приступим к написанию сценариев ...

Разочарование программирования оболочки Unix привело непосредственно к созданию Perl. Я обнаружил, что сценарии оболочки были внутренне ограничены тем фактом, что большинство его глаголов не находятся под его контролем, а существительные обеднены, ограничены строками и файлами, с неизвестной типологией. Я не хочу говорить на глупом компьютерном языке. Я хочу, чтобы мой компьютерный язык понимал строки, которые я набираю.

Для получения дополнительной информации посетите perl.com