Если количество элементов левого списка больше количества элементов правого в операции
множественного присваивания, то переменные левого списка, которым не хватило значений, не будут
определены (их значения будут равны пустой строке""). Если правый список содержит больше элементов,
чем левый список, то лишние значения просто не используются.
@m = (10, 20);
($a, $b, $c) = @m; # $a = 10, $b = 20, $с = ""
@m[2..3] = (30, 40); # Добавили в массив @m еще
# два элемента
($а, $b, $с) = @m; # $a = 10, $b = 20, $с = 30
# Значение 40 не используется
Эти примеры также показывают, что в списковом контексте, создаваемом для правого операнда
операции присваивания конструктором массива левого операнда, массив скаляров вычисляется в виде
списка значений своих элементов. В скалярном контексте массив скаляров будет вычисляться равным
количеству содержащихся в нем элементов, что удобно для определения числа его элементов:
$a = @m; # $a = 4
Хэш-массивы, как и массивы скаляров, по-разному вычисляются в списковом и скалярном контексте.
В списковом контексте они «возвращают» список, состоящий из элементов всех пар ключ/значение:
%hash = (red => 1, green => 2, blue => 3, black => 4);
@list = %hash; # @list = (blue, 3, green, 2, black, 4, red, 1)
При этом невозможно предсказать последовательность расположения пар ключ/ значение в
вычисляемом списке, так как хэш-массивы хранят свои элементы в последовательности, наиболее
удобной для доступа к ним. Эту ситуацию можно наблюдать в приведенном выше фрагменте, если
распечатать полученные значения элементов массива @list (в комментарии к оператору присваивания
показаны эти значения, полученные на нашем компьютере).
В скалярном контексте хэш-массив вычисляется в виде строки, содержащей два целых числа,
разделенных символом наклонной черты. Последнее число показывает количество выделенных для
хранения элементов хэш-массива участков памяти, а первое — количество использованных участков.
Например, для хэш-массива, созданного в предыдущем фрагменте сценария Perl, получим следующий результат:
$scalarHash = %hash; # $scalarHash = "3/8"
Любая переменная Perl может находиться в одном из двух состояний: определена и не определена.
Если ей присвоено какое-либо значение, то такая переменная считается определенной, в противном
случае — неопределенной. В выражениях неопределенная переменная вычисляется по-разному в
зависимости от используемого контекста. Если при запуске интерпретатора установлен ключ -w, то
использование в выражениях неопределенных переменных приведет к отображению предупреждающих сообщений.
Перед использованием переменной в выражении можно проверить ее «определенность» функцией
defined,
которая возвращает единицу, если переменная определена, и пустую строку в противном случае:
$var = 4;
defined($var); # Возвращает 1
defined(@var); # Возвращает "",
# массив @var не инициализирован
В любой момент определенную переменную можно сделать неопределенной с помощью функции
undef,
передав в качестве параметра имя соответствующей переменной:
@array = (10, 20);
defined(@array); # Возвращает 1 - массив определен
undef(@array);
defined(@array); # Возвращает "" - массив не определен
ПРИМЕЧАНИЕ Заметим, что сделанная неопределенной переменная, естественно, теряет присвоенное
ей ранее значение.
Завершая разговор о переменных, коротко обсудим такие понятия, как область видимости и
время жизни переменной. Область программы, откуда можно обратиться к переменной, называется
областью видимости переменной. В наших примерах все переменные были глобальными — они доступны
из любой части программы: блока или подпрограммы. Perl позволяет создавать переменные, доступ к
которым возможен только из определенной части программы. Это так называемые локальные переменные,
и их область видимости ограничена блоками и подпрограммами. Для локальных переменных можно
использовать имена, совпадающие с именами глобальных переменных, так как они создаются только
на время выполнения блока или подпрограммы, в которых они определены. После завершения
выполнения операторов подпрограммы или некоторого блока локальные переменные уничтожаются и
становятся недоступными. При очередном входе в блок или вызове подпрограммы они снова создаются
и становятся доступными. Более подробно мы будем изучать локальные переменные в главах 5 и 10.