Значение undef

Что произойдет, если попытаться использовать скалярную переменную до того, как ей будет присвоено значение? Ничего серьезного и уж точно ничего опасного. До первого присваивания переменные содержат специальное значение undef, которое на языке Perl выражает всего лишь следующее: «Не на что тут смотреть – проходите мимо». Если вы попытаетесь использовать это «ничто» как «числовое нечто», оно интерпретируется как нуль. Если вы попытаетесь использовать его как «строковое нечто», оно интерпретируется как пустая строка. Однако undef не является ни строкой, ни числом; это совершенно отдельный вид скалярного значения.

Так как undef автоматически интерпретируется как нуль при использовании в числовом контексте, мы можем легко реализовать накопление суммы с пустым начальным значением:

# Суммирование нечетных чисел
$n = 1;
while ($n < 10) {
$sum += $n;
$n += 2; # Переход к следующему нечетному числу
}
print "The total was $sum.\n";

Такое решение нормально работает, если переменная $sum содержали undef до начала цикла. При первой итерации переменная $n равна 1; первая строка в теле цикла увеличивает $sum на 1.


Это равносильно прибавлению 1 к переменной, содержащей нуль (значение undef здесь используется так, как если бы оно было числом). После суммирования переменная содержит значение 1. После этого переменная уже инициализирована, и дальнейшее суммирование работает традиционно. Аналогичным образом реализуется накопление строк с пустой исходной строкой:

$string .= "more text\n";

Если $string содержит undef, переменная работает так, как если бы она содержала пустую строку; соответственно текст "more text\n" просто включается в переменную. Но если она уже содержит строку, новый текст присоединяется к концу строки. Программисты Perl часто используют новые переменные подобным образом, заставляя приложение интерпретировать undef как нуль или пустую строку в зависимости от ситуации. Многие операторы возвращают undef, если аргументы имеют недопустимые или бессмысленные значения. Если с переменной не делается ничего особенного, вы получите нуль или пустую строку, и ничего страшного не произойдет. На практике это обычно обходится без серьезных проблем; многие программисты используют такое поведение в своих программах.

Но следует знать, что при включенных предупреждениях Perl в большинстве случаев сообщает о необычном использовании undef, так как это может свидетельствовать о возникновении проблем. Например, простое копирование undef из одной переменной в другую пройдет нормально, а при попытке передать его print обычно выводится предупреждение.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Автоматическое преобразование между числами и строками
Бинарные операторы присваивания
Вещественные литералы
Встроенные предупреждения Perl
Выбор имен переменных

Вернуться в раздел: Perl / 1. Скалярные данные