Скалярные значения.

Все данные в Perl это скаляры, массивы скаляров и хеши скаляров. Скалярные переменные могут содержать числа, строки и ссылки. Преобразование числа - строки происходит автоматически по умолчанию. Скаляр может иметь только одно единственное значение, хотя это может быть ссылка на массив скаляров. Так как Perl сам преобразовывает числа в строки и наоборот, то программисту нет необходимости думать о том, что возвращает функция.

В Perl не существует типов "строка" или "число" или "файл" или что-то еще. Это контекстно зависимый полиморфный язык для работы с текстами. Скаляр имеет логическое значение "TRUE" (истина), если это не нулевая строка или число не равное 0.

В Perl существует два типа нулевых (null) скаляров - определенные (defined) и неопределенные (undefined). Неопределенное значение возвращается, когда что-то не существует. Например, неизвестная переменная, конец файла или ошибка. С помощью функции defined() вы можете заранее обнаружить подобное состояние.

Количество элементов массива так же является скаляром и начинается символами $#. Фактически $#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

0.12

.12E-10

0xABCD # Шестнадцатиричная запись

0377 # Если 0 в начале - восьмеричная

123_456_123 # Так тоже можно для удобства чтения.

Строки ограничиваются одинарными (') или двойными (") кавычками:

'Равняйсь, смирно!' или "Построимся и спасемся."

В хеше можно опускать кавычки, если индекс не содержит пробелов:

$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

Встроенные переменные Perl.

Описанные ниже переменные имеют в Perl специальные значения. Они обозначаются несколько непривычно для "глаза" программистов, т.к. состоят обычно только из двух символов, причем первый это '$' символ, с которого начинаются имена всех переменных, и произвольный часто не буквенно-цифровой символ. Если вы хотите пользоваться их "нормальными" буквенными синонимами, то вам нужно указать в начале программы:

use English;

Ниже приводятся имена встроенных переменных как в короткой, так и в длинной (словесной) форме. Некоторые из них имеют доступ только на чтение, поэтому изменить их значение невозможно.

$_ ($ARG) - переменная - по умолчанию для операторов ввода и поиска. То есть если в качестве аргумента не указана никакая переменная, то используется именно эта.

$цифра - содержит найденную в последнем поиске подстроку, когда шаблон содержит метасимволы в круглых скобках. Цифра - это номер скобок. Первая подстрока - номер 1.

$& ($MATCH) - найденная подстрока в последнем поиске по шаблону.

$` - подстрока, предшествующая найденной подстроке.

$' ($POSTMATCH) - подстрока, последующая за найденной подстрокой.

$+ ($LAST_PAREN_MATCH) - подстрока, найденная в поиске с выбором по "или".

$* ($MULTILINE_MATCHING) - если ее значение установить равным 1, то переменная, в которой осуществляется поиск, будет считаться многострочной, т.е. содержащей символы '\n' - перевод строки. Если значение равно 0, то переменная считается однострочной.

$. ($INPUT_LINE_NUMBER), ($NR) - номер прочитанной строки последнего оператора ввода. Закрытие файла вызывает очистку значения этой переменной.

$/ ($RS), ($INPUT_RECORD_SEPARATOR) - символ - признак конца входной строки. По умолчанию это '\n'

$| ($OUTPUT_AUTOFLUSH) - если присвоить этой переменной ненулевое значение, то будет сброс буфера вывода после каждой операции вывода. Значение по умолчанию - 0

$, ($OFS), ($OUTPUT_FIELD_SEPARATOR) - символ, добавляемый оператором print после каждого элемента из списка параметров.

$\ ($ORS), ($OUTPUT_RECORD_SEPARATOR) - символ, добавляемый print после вывода всех параметров.

$" ($LIST_SEPARATOR) - аналогичен "$,", но добавляется после каждого элемента массива, указанного в "....".

$# ($OFMT) - формат по умолчанию для вывода чисел.

$% ($FORMAT_PAGE_NUMBER) - формат по умолчанию для вывода номеров страниц.

$= ($FORMAT_LINES_PER_PAGE) - длина одной страницы. По умолчанию 60 строк.

$- ($FORMAT_LINES_LEFT) - количество оставшихся строк на странице.

$~ ($FORMAT_NAME) - имя формата текущего вывода. По умолчанию имя указателя.

$^ ($FORMAT_TOP_NAME) - имя текущего формата для заголовка страницы.

$: ($FORMAT_LINE_BREAK_CHARACTERS) - символы переноса строки для многострочных полей. В строке формата такие поля начинаются с '^'. По умолчанию '\n-'.

$^L ($FORMAT_FORMFEED) - символ перевода формата (листа). По умолчанию '\f'.

$^A ($ACCUMULATOR) - текущее значение аккумулятора функции write() для format(). Значение этой переменной можно увидеть только при использовании функции formline(), т.к. write() очищает ее после каждого вывода.

$? ($CHILD_ERROR) - данная переменная содержит статус завершения таких процессов как: закрытие pipe, завершение функций system(), wait() и `...`.

$! ($ERRNO $OS_ERROR) - в числовом контексте возвращает код ошибки errno. В строковом - строку сообщения об ошибке. Можно принудительно присвоить этой переменной код ошибки, что бы получить системное сообщение для данного кода или установить код завершения для функции die().

$@ ($EVAL_ERROR) - сообщение об ошибке последней команды eval().

$$ ($PID), ($PROCESS_ID) - номер текущего процесса.

$O ($PROGRAM_NAME) - имя файла программы.

$[ - номер первого элемента массива или символа строки. Значение по умолчанию - 0.

$] ($PERL_VERSION) - строка - сообщение версии Perl. Печатается по команде perl -v В числовом контексте это номер версии плюс номер модификации / 1000.

$^T ($BASETIME ) - Время в секундах с начала 1970 года старта текущей программы.

$^X ($EXECUTABLE_NAME) - команда запуска Perl. Аналогично argv[0] в С.

$ARGV - имя текущего файла, читаемого оператором '<>'.

@ARGV - массив параметров строки запуска программы. Внимание! @#ARGV - меньше количества параметров на 1, т.к. $ARGV[0] это первый параметр (не имя программы).

@INC - список директорий диска, которые просматривает Perl для выполнения команд do, require или use.

%INC - этот хеш содержит имена директорий для имен использованных файлов командами do или require. Ключ - имя файла, а значение - директория.

$ENV{выражение} - хеш %ENV содержит значения переменных окружения. Изменение этих значений вызывает изменение окружения для процессов потомков.

$SIG{выражение} - хеш %SIG содержит имена подпрограмм для таких системных сигналов как INT, QUIT, PIPE, ... Значение 'DEFAULT' - для системной обработки. 'IGNORE' - игнорировать данный сигнал.

Регулярные выражения (шаблоны).

Регулярные выражения в Perl чаще всего используются в операторах поиска и замены таких как s/, m/, операторах связки =~ или != и т.д. Все эти операторы имеют схожие опции:

i - не различать строчные и заглавные буквы.
m - считать строку многострочной.
s - однострочная строка.
x - расширенный синтаксис (использование пробелов и комментариев)

Эти опции, обозначаемые как '/x', можно использовать внутри шаблонов, используя конструкцию (?...). В шаблонах используются следующие метасимволы (символы, обозначающие группы других символов):

\ - считать следующий метасимвол как обычный символ.
^ - начало строки
. - один произвольный символ. Кроме '\n' - конец строки.
$ - конец строки
| - альтернатива (или)
() - группировка
[] - класс символов

Метасимволы имеют модификаторы (пишутся после метасимвола):

* - повторяется 0 или большее число раз
+ - -//- 1 или большее число раз
? - 1 или 0 раз
{n} - точно n раз
{n,} - по меньшей мере раз
{n,m} - не меньше n, но и не больше m

Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом '*' эквивалентна {0,} , '+' - {1,} и '?' - {0,1}. n и m не могут быть больше 65536.

По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз, сколько возможно, не учитывая результат действия следующих метасимволов. Если вы хотите "уменьшить их аппетит", то используйте символ '?'. Это не изменяет значение метасимволов, просто уменьшает распространение. Таким образом:

*? - станет 0 и более
+? - 1 и более
?? - 0 или 1 раз
{n}? - точно n раз
{n,}? - не меньше n раз
{n,m}? - больше или равно n и меньше m раз

Шаблоны работают так же, как и двойные кавычки, поэтому в них можно использовать `\` - символы (бэкслэш-символы):

\t - символ табуляции
\n - новая строка
\r - перевод каретки
- перевод формата
\v - вертикальная табуляция
\a - звонок
\e - escape
\033 - восьмеричная запись символа
\x1A - шестнадцатеричная
\c[ - control символ
\l - нижний регистр следующего символа
\u - верхний регистр -//-
\L - все символы в нижнем регистре до \E
\U - в верхнем -//-
\E - ограничитель смены регистра
\Q - отмена действия как метасимвола

Дополнительно в Perl добавлены следующие метасимволы:

\w - алфавитно-цифровой или '_' символ
\W - не -//-
\s - один пробел
\S - один не пробел
\d - одна цифра
\D - одна не цифра

Обратите внимание, что все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так:

\w+ - слово
\d+ - целое число
[+-]?\d+ - целое со знаком
[+-]?\d+\.?\d* - число с точкой

Существуют мнимые метасимволы, обозначающие места смены значения:

\b - граница слова
\B - не граница слова
\A - начало строки
\Z - конец строки
\G - конец действия m//g

Граница слова (\b) - это мнимая точка между символами \w и \W. Внутри класса символов '\b' обозначает символ backspace (стирания). Метасимволы \A и \Z - аналогичны '^' и '$', но если начало строки '^' и конец строки '$' действуют для каждой строки в многострочной строке, то \A и \Z обозначают начало и конец всей многострочной строки.

Если внутри шаблона применяется группировка (круглые скобки), то номер подстроки группы обозначается как '\цифра'. Заметьте, что за шаблоном в пределах выражения или блока эти группы обозначаются как '$цифра'. Существуют и дополнительные переменные:

$+ - обозначает последнее совпадение
$& - все совпадение
$` - все до совпадения
$' - все после совпадения

Листинг 5.1.Переменные совпадений.

$s = "Один 1 два 2 и три 3";

if ($s =~ /(\d+)\D+(\d+)/) {

print "$1\n"; # Результат '1'

print "$2\n"; # '2'

print "$+\n"; # '2'

print "$&\n"; # '1 два 2'

print "$`\n"; # 'Один '

print "$'\n"; # ' и три 3'

}

Perl версии 5 содержит дополнительные конструкции шаблонов:

(?#комментарий) - комментарий в теле шаблона.
(?:шаблон) - группировка как и '( )', но без обратной ссылки
(?=шаблон) - "заглядывание" вперед. Например /\w+(?=\t)/ соответствует слову, за которым идет табуляция, но символ '\t' не включается в результат.
(?!шаблон) - "заглядывание" вперед по отрицанию.







Дата добавления: 2015-11-04; просмотров: 926;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.023 сек.