Шрифт:
Интервал:
Закладка:
Проще говоря если в левой части выражения имеется ввиду одно единственное значение – то это скалярный контекст. Если множество значений – список.
Пример:
$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 # Шестнадцетиричная запись
0377 # Если 0 в начале – восьмеричная
123_456_123 # Так тоже можно для удобства чтения.
Строки ограничиваются одинарными (') или двойными (") кавычками:
'Ровняйсь, смирно!'
«Построемся и спасемся.»
Способов обозначения строк очень много. Плодробно смотрите описание оператора qq.
В хеше можно опускать кавычки если индекс не содержит пробелов.
Пример:
$var1{first} то же что и $var1{'first'}
Обратите внимание на то что перед первой одинарной кавычкой должен стоять пробел иначе строка воспримется как имя переменной так-как в именах разрешено использование одинарных кавычек.
Запрещается в кавычках применять зарезервированные литералы __LINE__ (номер текущей строки программы), __FILE__ (текущий файл).
Для обозначения конца программы можно применять литерал __END__
Весь последующий текст игнорируется, но его можно прочитать использую указатель файла DATA.
Слова в программе не поддающиеся ни какой интепретации воспринимаются как строки в кавычках поэтому рекомендуется имена меток и указателей файлов писать большими буквами для избежания возможного «конфликта» с зарезервированными словами.
В Перл есть возможность вставлять текст документа прямо в программу.
Так называемый "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,
);
Тип typeglobsВ Перл используется специальный внутренний тип typeglog для записи массива всех переменных. Такие массивы начинаются с символа '*'. Их удобно применять для передачи ссылок на массивы и хеши, но в данной версии Перл уже есть возможность применять ссылки поэтому это делается очень редко. Единственно где это необходимо так это для работы со ссылками на файлы. Например если вам нужно создать локальную ссылку на файл в процедуре то это лучше сделать так:
sub new_sub
{ local *IN; # Ссылка на файл
open (IN, «test») || return undef; # Открыть файл. Возврат при ошибке.
.........
return;
}
Более подробно это описано в главе Ссылки.
Встроенные переменные Перл
Описанные в данной главе переменные имеют в Перл специальные значения.
Они обозначаются несколько непривычно для «глаза» программистов т.к. состоят обычно только из дву символов причем первый это '$' символо с которого начинаются имена всех переменных и произвольный часто не буквенно-цифровой символ. Если вы хотите пользоваться их «нормальными» буквенными синонимами то вам нужно указать в начале программы:
use English;
Точно так же если вы захотите пользоваться переменными и методами текущего указателя файлов вы можете написать:
use FileHandle;
после этого можно можно просто писать:
метод указатель выражение
или
указатель -> метод(выражение)
Ниже приводятся имена как в короткой так и в длинной (словесной) форме.
Некоторые из встроенных переменных имеют доступ тоько на чтение поэтому изменить их значение просто не возможно.
$_
$ARG
Переменная – по умолчанию для операторов ввода и поиска. То есть если в качестве аргумента не указана никакая переменная то используется именно эта.
$цифра
Содержит найденные подстроку в последнем поиске когда шаблон содержит метасимволы в круглых скобках. Цифра в данном случае это номер скобок. Первая подстрока имеет номер 1.
$&
$MATCH
Найденная подстрока в последнем поиске по шаблону.
$`
Подстрока предшевствующая найденной подстроке.
$'
$POSTMATCH
Подстрока последующая за найденной подстрокой.
$+
$LAST_PAREN_MATCH
Подстрока найденная в поиске с выбором по «или».
$*
$MULTILINE_MATCHING
Если значение этой переменной установить равным 1 то переменная в которой осуществляется поиск будет считаться многосторочной т.е. содержащей символы 'n' – перевод строки. Если значеие равно 0 то переменная считается однострочной. В Перл версии 5 и выше не рекомендуестя использовать эту переменную.
- Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп - Программирование
- Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри - Программирование
- Каждому проекту своя методология - Алистэр Коуберн - Программирование
- Взломать всё. Как сильные мира сего используют уязвимости систем в своих интересах - Брюс Шнайер - Программирование
- UNIX: взаимодействие процессов - Уильям Стивенс - Программирование