Введение в Perl - Маслов Владимир Викторович
Шрифт:
Интервал:
Закладка:
В Перл нет специального оператора switch подобного языку С поэтому вы сами можете создавать удобные для вас конструкции.
Опыт автора показывает что для простоты написания лучше всего подходит конструкция вида if ... elsif ... else ... хотя можно сочинить и нечто подобное:
SWITCH:
{
if ($i ==1 ) { .....; last SWITCH; }
if ($i ==2 ) { .....; last SWITCH; }
if ($i ==3 ) { .....; last SWITCH; }
$default = 13;
}
Выбирайте сами по своему вкусу.
Оператор goto.В Перл существует оператор goto хотя где , как и когда его применять как говорил Ходжа Насредин «Тонкий филосовский вопрос».
Для начинающих программистов которым от так «нужен» я бы вообще посоветовал «забыть» о его существовании. Однако при создании больших производственных задач на последнем этапе особенно при отработке «отвальных» ошибочных ситуаций конечно goto нужен.
В Перл реализовано три формы goto. goto – метка, goto – выражение и goto – подпрограмма.
goto – метка выполняет непосредственный переход на указанную метку.
goto – выражение – Вычисляет имя метки и делает соответсвующий переход.
Например если мы хотим сделать переход на одну из трех меток "M1:", "M2:" или "M3:" в зависимости от значений переменной $i равной 0, 1 или 2 то это лучше сделать следующим образом:
goto («M1», «M2», «M3»)[$i];
здесь $i используется как индекс массива указанного непосредственно в выражении.
goto подпрограмма – довольно редкий случай т.к. всегда проще и надежней вызвать подпрограмму «естественным» образом.
POD операторы. Документирование программ.В Перл реализован очень удобный механизм для написания документации в момент создания программы. Для этого применяются специальные POD операторы.
Если в теле программы интерпретатор встречает оператор начинающийся с символа '=' например:
= head Набор стандартных процедур
то пропускается все до слова '=cut'. Это удобно для включения длинных на несколько строк или страниц комментариев. Затем
с помощью специальной программы pod можно отделить текст документации от текста программы.
Переменные
В Перл существует три типа структур данных: скаляры, массивы скаляров и хеши (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 – разные переменные. В Перл по умолчанию имена меток и указателей файлов пишут большими буквами.
Контекст.Большое значение для правильного употребления встроенных функций имеет контекст использования результата этих функций т.к. в противном случае они возвращают совершенно «непонятный» результат.
В Перл имеется два главных контекста: скалярный и список (list).
Проще говоря если в левой части выражения имеется ввиду одно единственное значение – то это скалярный контекст. Если множество значений – список.
Пример:
$var1 = <>; # Прочитать одну строку файла
@var1 = <>; # Прочитать все строки файла в массив @var1
$var1 = (1,2,3); # $var = 3 – количество элементов
@var1 = (1,2,3); # Создание массива @var1 с элементами 1,2,3
Скалярные значения.Все данные в Перл это скаляры, массивы скаляров и хеши скаляров.
Скалярные переменные могут содержать числа, строки и ссылки.
Преобразование числа – строки происходит автоматически по умолчанию.
Скаляр может иметь только одно единственное значение, хотя это может быть ссылка на массив скаляров. Так – как Перл сам преобразовывает числа в строки и наоборот то программисту нет необходимости думать о том что возвращает функция.
В Перл не существует типов «строка» или «число» или «файл» или что то еще.
Это контекстно зависимый полиморфный язык для работы с текстами.
Скаляр имеет логическое значение "TRUE" (истина) если это не нулевая строка или число не равное 0.
В Перл существует два типа нулевых (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 # Шестнадцетиричная запись