Язык программирования Perl - [8]

Шрифт
Интервал

>$email_address = '[email protected]';


Если значение переменной не присвоено, в ней хранится специальное неопределенное значение undef. Неопределенность значения переменной можно проверить с помощью встроенной функции defined(), возвращающей истинное значение, если значение переменной определено. Одна и та же переменная может поочередно иметь неопределенное значение или хранить значение любого из основных типов, например, строку или число (целое или дробное):


>$variable;

>$variable = 'Строка';

>$variable = 25;

>$variable = 3.141592653;


В именах переменных заглавные и строчные буквы различаются, поэтому приведенные ниже имена относятся к совершенно разным переменным:


>$language $Language $LanguagE $LaNgUaGe


Необъявленные переменные имеют глобальную область видимости в пределах пакета. Область видимости переменных определяется рамками программных единиц: блоков, подпрограмм, пакетов, о которых подробно будет рассказано в лекциях 12 и 13. Чтобы задать область видимости переменных, нужно их объявить явно. Для объявления переменных применяются такие ключевые слова:

[x]. my - переменные с лексической областью видимости;

[x]. our - глобальные переменные с лексической областью видимости;

[x]. local - временное скрытие глобальных переменных.

В одном объявлении можно перечислить несколько переменных. Объявляемым переменным рекомендуется сразу присваивать начальные значения, например:


>local $_ = 25

>my ($buffer = '', $count = 0, $end_of_file = 0)

>our $version = 2.5, $author = 'Mike Shock'


Различия между этими типами переменных будут подробно рассмотрены в лекциях, посвященных подпрограммам и модулям. А пока, памятуя об общих правилах хорошего стиля программирования и требованиях к надежности программ, постараемся свести к минимуму использование глобальных переменных. Для этого достаточно взять за правило преимущественно использовать лексические переменные, объявляемые с помощью ключевого слова my. Применение переменных с лексической видимостью также сокращает расход памяти, поскольку они автоматически уничтожаются при выходе из области видимости.

Значения переменных, как и escape-последовательности, могут интерполироваться, если они помещены в строковый литерал, заключенный в двойные кавычки. Этим широко пользуются в программах на Perl для удобного формирования строк, в которые нужно подставить вычисленные значения переменных. Например, так:


>"Прочитано $n строк"

>"Используемая версия Perl = $"

>"Письмо для $name отправлено по адресу $email"


Благодаря разыменовывающему префиксу $, переменные хорошо различимы в строковых литералах. При интерполяции в качестве имени переменной рассматривается максимальная последовательность символов, которая может быть идентификатором. Поэтому нужно быть внимательным в случаях, когда после имени переменной в строке нет знаков препинания или пробелов. Например, при вставке в строку переменной $delimiter следующим образом:


>"One$delimiterTwo"


будет подставлено значение несуществующей переменной $delimiterTwo. Чтобы явно отделить имя вставляемой переменной от последующих символов, нужно имя переменной после префикса заключить в фигурные скобки, вот таким образом:


>"One${delimiter}Two"


Если в строковый литерал нужно включить символ доллара, не являющийся префиксом переменной, то можно заключить литерал в одинарные апострофы или "экранировать" символ доллара (отменить его специальное значение), поставив перед ним обратную косую черту:


>'переменная $var не интерполируется'

>"переменная \$var не интерполируется"


Весьма удобно, что преобразования между строками и числами выполняются автоматически в зависимости от контекста выражения, в котором они используются. В языке Perl для уточнения смысла языковых конструкций часто используется понятие контекста, под которым понимается программное окружение элемента языка (переменной, подпрограммы и так далее), определяющее его использование. Скалярные переменные, рассмотренные в этой лекции, используются в скалярном контексте (подразумевающем использование одного значения). А он, в свою очередь, может подразделяться на строковый и числовой контекст. Например, в переменную помещено число:


>$year = 1987


При использовании ее в числовом контексте (например, в арифметическом выражении для сложения с другим числом) будет использовано числовое значение переменной. При использовании этой же переменной в строковом контексте (например, в операторе вывода) будет произведено преобразование внутреннего представления числа к строке. Другой пример: если переменной не присвоено никакое значение, то в числовом контексте ее значением будет 0, а при использовании ее в строковом контексте - пустая строка (''). К счастью, в большинстве случаев программисту вообще не приходится задумываться о контекстах, поскольку обычно perl выполняет как раз то, что имел в виду автор программы (в полном соответствии с упоминавшимся в первой лекции принципом DWIM). Но знание контекста помогает разобраться с тонкостями использования синтаксических конструкций языка Perl. В следующих лекциях мы познакомимся с другими контекстами, например, списочным и логическим.