Переменные языка Perl
В Perl существует три типа структур данных: скаляры, массивы скаляров и хеши (hashes) - ассоциативные массивы скаляров. Обычно элементы массивов индексируются целыми числами, первый элемент - нулевой. Отрицательное значение индекса обозначает номер позиции элемента с конца. Хеши индексируются строками символов. |
В Perl существует три типа структур данных: скаляры, массивы скаляров и хеши (hashes) - ассоциативные массивы скаляров. Обычно элементы массивов индексируются целыми числами, первый элемент - нулевой. Отрицательное значение индекса обозначает номер позиции элемента с конца. Хеши индексируются строками символов.
Имена скалярных переменных всегда начинаются с символа '$' даже когда обозначают элемент массива.
Пример:
$var1 # Простой скаляр 'var1' $var1[0] # Первый элемент массива 'var1' $var1{'first'} # Элемент с индексом 'first'
В случае использования имени массива "целиком" или его "среза" перед именем массива ставится символ '@'.
Пример:
@var1 # Все элементы массива var1 ( $var1[0], $var1[1], ... $var1[n]) @var1[1,3,10] # Элементы $var1[1], $var1[3], $var1[10] @var1{'first','last'} # то же что и ( $var1{'first'}, $var1{'last'} )
Хеш "целиком" начинается с символа '%'.
Пример:
%var, %key, %years
Имена подпрограмм начинаются символом '&', если из контекста не видно, что это подпрограмма.
Пример:
&sub1, &test_prog, test(12)
Имена таблиц символов всегда начинаются символом '*'.
Каждый тип переменных имеет свою область памяти поэтому $var1 и $var1[0] совершенно разные переменные, хотя $var1[0] часть массива @var1. Так же @var1 и %var1 - разные массивы переменных.
Имена переменных могут содержать любые буквенно-цифровые символы за исключением пробела и табуляции. Эти символы используются в качестве разделителей. Большие и малые буквы различаются поэтому $var1 и $Var1 - разные переменные. В Perl по умолчанию имена меток и указателей файлов пишут большими буквами.
Большое значение для правильного употребления встроенных функций имеет контекст использования результата этих функций, т.к. в противном случае они возвращают совершенно "непонятный" результат. В Perl имеется два главных контекста: скалярный и список (list). Проще говоря, если в левой части выражения имеется ввиду одно единственное значение, то это скалярный контекст. Если множество значений - список.
Пример:
$var1 = <>; # Прочитать одну строку файла @var1 = <>; # Прочитать все строки файла в массив @var1 $var1 = (1,2,3); # $var = 3 - количество элементов @var1 = (1,2,3); # Создание массива @var1 с элементами 1,2,3
Все данные в Perl это скаляры, массивы скаляров и хеши скаляров. Скалярные переменные могут содержать числа, строки и ссылки. Преобразование числа - строки происходит автоматически по умолчанию. Скаляр может иметь только одно единственное значение, хотя это может быть ссылка на массив скаляров. Так как Perl сам преобразовывает числа в строки и наоборот, то программисту нет необходимости думать о том, что возвращает функция.
В Perl не существует типов "строка" или "число" или "файл" или что-то еще. Это контекстно зависимый полиморфный язык для работы с текстами.
Скаляр имеет логическое значение "TRUE" (истина), если это не нулевая строка или число не равное 0.
В Perl существует два типа нулевых (null) скаляров - определенные (defined) и неопределенные (undefined). Неопределенное значение возвращается, когда что-то не существует. Например, неизвестная переменная, конец файла или ошибка. С помощью функции defined() вы можете заранее обнаружить подобное состояние.
Количество элементов массива так же является скаляром и начинается символами $# подобно интерпретатору csh. Фактически $#var1 - это индекс последнего элемента массива. Нужно помнить, что первый элемент имеет индекс 0, поэтому количество элементов определяется как $#var1+1 . Присвоение значения $#var1 изменит длину массива и разрушит "оставленные" значения. Присвоение значения элементу массива с индексом больше чем $#var1 увеличит размер массива, а присвоение ему нулевого списка -обнулит.
В скалярном контексте имя массива возвращает его длину (для списка возвращается последний элемент).
Пример:
@var1 = (4, 3, 2, 1); # Присвоение значения элементам массива $i = @var1; # Использование скалярного контекста print $i; # Печать результата 4 - кол-во элементов print @var1; # Списковый контекст, печать всех элементов.
Для принудительного получения скалярного значения удобно применять функцию scalar().
Пример:
print scalar(@var1); # Вывод длины массива а не его значений
Хеш в скалярном контексте возвращает "true", если существует хотя бы одна пара "ключ-значение". Фактически возвращается строка типа 2/8 где 8 - количество выделенных "ячеек" памяти, а 2 - количество использованных.
Числа пишутся стандартно:
123 123.123 0.12 .12E-10 0xABCD # Шестнадцатиричная запись 0377 # Если 0 в начале - восьмеричная 123_456_123 # Так тоже можно для удобства чтения.Строки ограничиваются одинарными (') или двойными (") кавычками:
'Равняйсь, смирно!' "Построимся и спасемся."
Способов обозначения строк очень много. Смотрите описание оператора qq.
В хеше можно опускать кавычки, если индекс не содержит пробелов.
Пример:
$var1{first} то же что и $var1{'first'}
Обратите внимание на то, что перед первой одинарной кавычкой должен стоять пробел, иначе строка воспримется как имя переменной, т. к. в именах разрешено использование одинарных кавычек. Запрещается в кавычках применять зарезервированные литералы __LINE__ (номер текущей строки программы), __FILE__ (текущий файл). Для обозначения конца программы можно применять литерал __END__ Весь последующий текст игнорируется, но его можно прочитать используя указатель файла DATA.
Слова в программе, не поддающиеся никакой интерпретации, воспринимаются как строки в кавычках, поэтому рекомендуется имена меток и указателей файлов писать большими буквами во избежание возможного "конфликта" с зарезервированными словами.
В Perl есть возможность вставлять текст документа прямо в программу. Так называемый "here-doc" (здесь текст) метод. Обозначается символами << за которыми идет слово-ограничитель.
Пример:
print <<EOF; # Все строки до EOF - текст для печати. Эй вы трое, идите двое сюда! Что стоишь! Я тебе говорю!! Полковник Савонькин. EOF
Список - множество значений, перечисленных через запятую и заключенных в круглые скобки. В списковом контексте список возвращает последний элемент списка.
Пример:
@var1 = (1, 2, 'привет', 1.2); # Присвоить значение элементам.где
$var1[0] = 1, $var1[1] = 2, $var1[2] = 'привет' $var1[3] = 1.2 $var1 = (1, 2, 'привет', 1.2);а здесь $var1 = 1.2 т.е. последнее значение списка.
Допускается применять в списке другие списки, но в полученном списке уже невозможно различить начало и конец включенных списков.
Пример:
@s1 = (1, 2, 3); # Первый список @s2 = (6, 7, 8); # Второй s = (0, @s1, 4, 5, @s2, 9, 10); # Включаем списки @s1 и @s2 print @s; # Результат: 012345678910 - значения без пробелов.
Список без элементов обозначается как () и называется нуль-списком. Списковое выражение можно употреблять как имя массива, но при этом его нужно брать в круглые скобки.
Пример:
print ('январь','февраль','март')[1];Результат: февраль
Список может быть присвоен списку только если каждый элемент в списке в левой части выражения допустим по типу списку в правой части.
Пример:
($a, $b, $c) = (1, 2, 3); # $a = 1, $b = 2, $c = 3
Присваивание списков в скалярном контексте возвращает количество присвоенных элементов.
Пример:
$x = (($a, $b, $c) = (1,2)); # Результат $x=2
В случае присваивания списка хешу, список рассматривается как пары: ключ-значение.
Пример:
%дни_месяца = ('январь', 31, 'февраль', 30);Результат: $дни_месяца{январь} = 31, $дни_месяца{февраль} = 30
Для удобства записи можно использовать выражение с => .
Пример:
%дни_месяца = ( январь => 31, февраль => 30, );
В Perl используется специальный внутренний тип typeglog для записи массива всех переменных. Такие массивы начинаются с символа '*'. Их удобно применять для передачи ссылок на массивы и хеши, но в данной версии Perl уже есть возможность применять ссылки, поэтому это делается очень редко. Единственно где это необходимо, так это для работы со ссылками на файлы. Например, если вам нужно создать локальную ссылку на файл в процедуре, то это лучше сделать так:
sub new_sub { local *IN; # Ссылка на файл open (IN, "test") || return undef; # Открыть файл. Возврат при ошибке. ......... return; }
« Назад