Введение в Perl — страница 8 из 15

файл' здесь не имя файла, а указатель файла который создается функцией open(). В скалярном контексте читается одна строка вместе с символом '\n' – перевода строки, а в списковом весь файл читается в список элементы которого суть строки файла.

В случае обнаружения конца файла результат оператора не определен и воспринимается как false. Если не указана переменная результата то по умолчанию это $_. Указатель файла по умолчанию STDIN – стандартный ввод.

Пример:

while(<>) { print; }; # Прочитать и вывести весь файл STDIN

У оператора '<>' есть одна отличительная особенность. Если в командной строке нет никаких аргументов то читается стандартный ввод, если есть аргументы то они считаются именами файлов которые последовательно читаются.

Если в угловых скобках записана переменная то содержимое этой переменной считается именем указателя файла или ссылкой на указатель файла. Если такого указателя не существует то содержимое переменной воспринимается как шаблон имен файлов и результат – имена файлов на диске подходящих по шаблону.

Пример:

while(<*.pl>) { print;}; # То же что и ls *.pl

@files = <*>; # Массив @files содержит имена файлов в директории

но лучше сделать: @files = glob("*"); т.к. внутри скобок можно использовать переменные.


Слияние констант.

Как и С Перл выполняет возможные вычисления в период компиляции.

Так подстановка символов после '\' , операция конкатенации строк, арифметические выражения содержащие только одни константы, все это делается в момент компиляции что существенно увеличивает скорость выполнения программы.


Целочисленная арифметика.

По умолчанию Перл выполняет арифметику с плавающей запятой, но если вы укажете:

use integer;

то компилятор будет использовать целочисленную арифметику до конца текущего блока, хотя вложенный блок может это и отменить в своих пределах с помощью:

no integer;

Встроенные функции

Встроенные функции используются как термы выражений и подразделяются на две категории: списковые операторы и унарные операторы. Это влияет на их приоритет по отношению к оператору ',' – запятая. Списковые операторы могут именть множество (список) аргументов, а унарные только один. Таким образом запятая завершает аргументы унарного оператора и разделяет аргументы спискового.

Аргумент унарного оператора воспринимается обычно в скалярном контексте а спискового как в скалярном так и

списковом причем скалярные аргументы идут первыми. В дальнешем списковые аргументы мы будем обозначать словом 'LIST' это значит что функция имеет список аргументов разделенных запятой.

Аргументы функций можно заключать в круглые скобки и таким образом обозначать что «это функция» и приоритет не имеет значения иначе это списковый или унарный оператор с определенным фиксированным приоритетом. Пробел после имени функции и скобкой значения не имеет. Поэтому будьте внимательны!

Пример:

print 1 + 2 + 3; # результат 6

print(1+2)+3; # результат 3

print (1+2)+3; # опять 3

print (1+2+3); # 6

Если функция возвращает результат как в скалярном так и в списковом контексте то код выхода по ошибке – скаляр c неопределенным значением или пустой список.

Запомните правило:

Не существует общего правила преобразования списка в скаляр!

Каждый оператор и функция имеют свой вид значения в скалярном котексте.

Для одних это количество элементов из скалярного контекста. Для других первый элемент списка или последний или количество успешных операций. Каждый свое если вы специально не указываете.


Оператор '-X'.

-X указатель файла

-X выражение

-X

Проверка файла, где 'X' одно из ниже описанных значений.

Это унарный оператор с одним аргументом – либо именем файла либо указателем файла. Проверяет одно из условий. Если аргумент не указан то берется значение переменной $_. Для ключа -t STDIN.

Результат 1 если true и '' если false или неопределенное значение если файл не найден. Несмотря на странный вид это унарный оператор с соответсвующим приоритетом. Аргумент можно заключать в круглые скобки.

'X' имеет следующие значения:

-r Файл разрешен на чтение эффективным uid/gid

-w на запись -//-

-x исполнение -//-

-o принадлежит эффективному uid (идентификатор пользователя)

-R Файл разрешен на чтение реальным uid/gid

-W на запись -//-

-X исполнение -//-

-O принадлежит реальному uid

-e файл существует

-z пустой

-s не пустой

-f обычный текст

-d директория

-l символическая ссылка

-p pipes (конвейер)

-S socket (гнездо)

-b специальное блочное устройство

-c -//– символьное -//-

-t указатель на уст-во tty

-u установлен бит setuid

-g -//– setgid

-k -//– sticky

-T текстовой файл

-B двоичный

-M «возраст» файла в днях на момент старта скрипта

-A дней с последнего чтения

-C дней с последней модификации inode


abs выражение

Абсолютное значение выражения


accept NEWSOCKET, GENERICSOCKET

Окрыть новый сокет по внешнему запросу. Аналогично системному вызову accept(). Возвращает адрес или false в случае неудачи.


alarm секунды

Послать сигнал SIGALARM текущиму процессу по истечении указанного промежутка времени. Не допустимо делать несколько вызовов одновременно в одном промежутке времени.

Возвращает остаток времени предыдущего счетчика.


atan2 Y, X

Арктангес отношения Y к X в пределах от -pi до +pi.


bind сокит, имя

Назначить сетевой адрес сокиту. Подобно системному вызову bind. Возвращает true в случае успеха и false иначе.

Имя – пакетный адрес сокита.


binmode файл

Открыть файл для двоичного (binary) режима доступа.

В обычном режиме при вводе символы CR LF транслируются в LF, а при выводе LF транслируется в CR LF.


функция bless

bless ссылка, класс

bless ссылка

Данная функция определяет что объект указанный ссылкой принадлежит классу. Если класс не указан то он относится к текущему классу. Обычно это последний оператор в конструкторе объекта.

Необходимо обязательно указывать имя класса если определяемый объект может наследоваться классом-потомком.


функция caller

caller выражение

caller

Возвращает контекст вызова текущей подпрограммы.

В скалярном контексте true если это подпрограмма или процедура вызванная операторами eval() или require() и false – иначе.

В списковом это список ($package, $filename, $line)

где

$package – имя пакета

$filename – имя файла пакета

$line – номер строки откуда был сделан вызов.

Если указано выражение то возвращается список:

($package, $filename, $line, $subroutine, $hasargs, $wantargs)

Выражение определяет «глубину» вложенности просмотра стека вызовов.

$subroutine – имя подпрограммы

$hasargs – имеющиеся аргументы

$wantargs – необходимые аргументы

Применение данной функции в DB пакете возвращает более детальную информацию. К списку аргументов добавляется список @DB::args.


chdir выражение

Перейти в директорию указанную выражением. Если выражение отсутсвует то перейти в «домашнию» директорию.

Возвращает true в случае успеха и false – неудачи.


chmod список

Изменить права доступа к файлам указанным в списке.

Первый элемент в списке – числовое ,обычно восьмеричное значение прав.

Возвращает количество файлов которым были изменены права.

Пример: 

chmod 0666 'f1', 'f2', 'f3';


chomp переменная

chomp список

chomp

Удаляет в конце строки символ указанный переменной $/.

Обычно это 'LF'. Возвращает количество удаленных символов. Если переменная не указана то используется переменная $_.

Если указан список то обрабатывается каждая строка списка и возвращается общее количество удаленных символов.


chop переменная

chop список

chop

Полностью аналогично функции chomp но всегда удаляет последний символ строки.


chown список

Изменить «владельца» и «группу» файлов списка.

Первый элемент – номер нового владельца, второй номер новой группы а далее список файлов.

В большинстве Юникс-систем вы не сможете сменить владельца если вы не суперпользователь, но можете изменить группу если это одна из ваших «вторичных» групп.


chr число

Возвращает символ с указанным кодом кодировки.


chroot директория

Сделать «корневой» указанную директорию.

«Корневая» – значит внутри программы на нее можно ссылаться как '/'.


close файл

Закрыть открытый файл или поток. Можно не использовать

если один и тот же файл открывается повтортно т.к. он будет автоматически закрываться новым вызовом open().


closedir директория

Закрыть директорию открытую функцией opendir().


connect сокит, имя