Подпрограммы и функции. «Старые» современные возможности Perl

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

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

списковом причем скалярные аргументы идут первыми. В дальнешем списковые аргументы мы будем обозначать словом "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" одно из ниже описанных значений.

Это унарный оператор с одним аргументом – либо именем файла либо указателем файла. Проверяет одно из условий. Если аргумент не указан то берется значение переменной $_. Для ключа -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 директория

-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

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

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


функция 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 список

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

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

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


chop переменная

chop список

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


chown список

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

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

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


chr число

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


chroot директория

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

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


close файл

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

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


closedir директория

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


connect сокит, имя

Связаться с удаленным сокитом. Данная функция подобна системному вызову connect() . Возвращает true в случае успеха

и false при ошибке.


cos выражение

Косинус выражения в радианах.


crypt текст, salt

Шифрация текта. Аналогично системному crypt() .

dbmclose хеш

Закрывает связь между хеш и базой данных.


dbmopen хеш, база, режим

Ассоциировать указанный хеш и базу в определенном режиме.

Дело в том что в Перл реализован очень удобный механизм работы с базами данных типа dbm, ndbm, sbdm, gdbm и Berkeley DB. Для этого нужно связать (открыть) базу под именем хеша. Вся работа с записями базы выполняется так будто это обычный хеш (ассоциативный массив).

Более подробно смотрите описание функции AnyDBM() .


define выражение

Возвращает true если значение определено (существует) и false если нет. Многие операции завершаются не определенным значением, например чтение после конца файла, использование не определенных переменных, системные ошибки и т.д.

Данная функция позволяет различать нулевое и не определенные значения, определенность или не определенность функций или ссылок. При использовании определенности ключа в хеше она возвращает определен данный ключ или нет но не существует он или нет.


delete выражение

Удалить значение из хеша. Возвращает удаляемое значение или не определенность если ни чего не удаляется.

Удаление из массива окружения $ENV{} – изменяет окружение.

Удаление из хеша связанного с базой данных – удаляет запись в базе данных.


die список

Если программа не была запущена из eval() данная функция выводит список в поток STDERR и завершает работу программы с кодом из переменной $!. Если $! содержит 0 то с кодом ($? >> 8). Если и это 0 то с кодом 255.

При вызове из eval() сообщение об ошибке заносится в переменную $@ и eval() завершается с неопределенным значением. Это позволяет отробатывать ошибочные ситуации не завершая головной модуль.

Если строка из списка не завершается символом "\n" то дополнительно печатается номер строки скрипта откуда вызвана функция и номер входной строки исли таковой имеется.


do BLOCK

Это не совсем функция. Здесь возвращается значение последнего оператора блока. Когда используется циклический модификатор

BLOCK исполняется перед проверкой условия цикла в отличии от обычных циклов.


do подпрограмма

Устаревший метод вызова подпрограмм.


do выражение

Значение выражения воспринимается как имя файла Перл скрипта.

Изначально это применялось для включения подпрограмм библиотеки.

Сейчас правильней использовать вызовы use() и require() которые обеспечивают контроль ошибок и завершения.


dump метка

Выполнние «дампа» текущей памяти. Применялось для возможности исрользовать программу undump что бы включить текущий исполняемый код в программу после инициализации всех переменных.

Выполнение этой новой программы будет начинаться оператором goto метка. Если метка опущена то запуск сначала.

Внимание! Файлы открытые до момента дампа не будут открытыми

в момент исполнения новой программой.


each хеш

Возвращает 2-элементный массив. Первый элемент – ключ второй – значение следующего элемента хеша. Позволяет «просматривать» все значения хеша в определенном порядке. Сброс переменной цикла происходит только после прохождения всего массива.


eof()

Возвращает 1 если выполняется чтение после конца или чтение из не открытого файла. Аргументом должно быть выражение возвращающее существующий указатель файла. Данную функцию нельзя использовать для чтения файлов открытых как терминалы.

Если аргумент не указан то используется последний читаемый файл.

Использование в форме eof() целесообразно применять в циклах while(<>) для определения конца только последнего файла из

списка. Применяйте eof(ARGV) или eof для определения конца каждого файла из списка.


eval выражение

eval выражение

Выражение сканируется и выполняется как обычная Перл программа.

Это делается в контексте текущей программы поэтому можно использовать уже определенные переменные и подпрограммы.

Ворзвращается результат последнего оператора в блоке или значение оператора return . Если обнаружится синтаксическая ошибка или выполнится оператор die возвращается не определенное значение а переменная $@ содержит сообщение об ошибке. Если ошибки не было то $@ содержит нулевую строку. При отсутсвии аргумента берется значение переменной $_.


exec список

Выполняется системная команда из списка и выполнение программы завершается. Если вам необходимо вернуться то лучше применяйте функцию system() . Если в списке количество аргументов больше 1 или список это массив с количеством элементов больше 1 то выполняется системный вызов execvp() с аргументами из списка.

Если один скалярный аргумент то он сканируется на обработку метасимволов и если они присутсвуют то полученные аргуметы передаются интерпретатору /bin/sh -c для дальнейшей обработки.

Если метасимволов нет то аргумент расщепляется на слова и передается системному вызову execvp() что более эффективно.

Внимание! exec() и system(0) не сбрасывают буфер ввода/вывода поэтому необходимо установить переменную $| для предотвращения потери выходной информации.


exists выражение

Возвращает true если существует указанный ключ хеша даже если не определено его значение.


exit выражение

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


exp выражение

Возвращает e (основание натурального логарифма) в степени выражения.


fcntl файл, функция, скаляр

Выполняет системный вызов fcntl(). Для использования обязательно выполнить use Fcntl;


fileno файл

Возвращает описатель файла для данного указателя файла.


flock файл, операция

Системный вызов flock()


fork

Системный вызов fork(). Возвращает pid потомка для родителя и 0 для потомка в случае успеха иначе – неопределенное значение.


format

Декларативная функция Перл. Определяет формат вывода для оператора write . Подробно смотрите главу Форматы.


formline формат, список

Внутренняя функция используемая в format. Форматирует вывод параметров из списка. Результат помещается в переменную $^A.Функция write просто выводит значение этой переменной, но ее так же можно читать а затем обнулять. Обычно format выполняе один вызов formline для одной строки формы, но formline не разделяет строки формата. Это значит что символы "~" и "~~" рассматривают весь формат как одну строку поэтому необходимо использовать многострочные формыд для описания одной записи формата.


getc файл

getc файл

Читает и возвращает символ из указанного файла.

Если файл не указан то читается STDIN. После конца файла возвращает пустую строку.


getlogin

Возвращает текущий login из файла /etc/utmp

Не применяйте для идентификации пользователя он не так сильно «закрыт» как getpwuid().


getpeername сокит

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


getpgrp PID

Возвращает группу процесса с указанным PID. Если аргумент отсутсвует возвращает группу текущего процесса.


getppid

Возвращает PID родительского процесса.


getpriority WHICH, WHO

Возвращает текущий приоритет процесса, группы процессов или пользователя.

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

После того, как у Вас появится идея программы, Вы должны разработать схему ее построения - в вашей голове или на бумаге. Каждый шаг в схеме мог бы являть собой одну функцию в вашей программе. Это называется модульным программированием. Модульное программирование очень хорошо позволяет Вам скрывать детали программы, благодаря чему улучшается читабельность исходного текста вашей программы.

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

$areaOfFirstCircle = areaOfCircle($firstRadius);

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

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

Давайте присмотримся к вызову функции - сначала мы видим скалярную переменную, затем - оператор присвоения. Вы уже знаете, что это означает - Perl присвоит переменной $areaOfFirstCircle значение, стоящее справа от знака присваивания. Но что в действительности стоит справа?

Первое, что вы видите - это имя функции areaOfCircle(). Круглые скобки справа и отсутствие перед именем символов $, @ и % говорит о том, что это - вызов функции. Внутри круглых скобок содержится список параметров или значений, передающихся функции.

Вычисление площади круга:

$areaOfFirstCircle = areaOfCircle(5);
print("$areaOfFirstCircle\n");
sub areaOfCircle {
$radius = $_;
return(3.1415 * ($radius ** 2));
}

Программа напечатает:

Объявление функции:

sub имяФункции {
тело функции
}

И все. Ваша функция готова.

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

Внутри функции массив параметров имеет имя @_. Все параметры, передаваемые функции, содержатся в массиве @_, откуда их можно извлечь при необходимости.

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

$radius = $_;

Эта строка присваивает первый элемент массива @_ скалярной переменной $radius.

Если вы хотите, вы можете не использовать в функции оператор return для возврата значения, - Perl автоматически возвратит значение последнего вычисленного выражения. Но будет лучше, если вы все же будете использовать оператор return - так вы избежите многих случайных ошибок.

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

Использование массива параметров (@_)

Как уже говорилось ранее - все параметры функция может найти в массиве параметров @_. Это очень удобно - чтобы узнать, сколько параметров было передано функции, нужно всего лишь обратиться к массиву параметров @_ в скалярном контексте.

firstSub(1, 2, 3, 4, 5, 6);
firstSub(1..3);
firstSub("A".."Z");
sub firstSub {
$numParameters = @_ ;
print("The number of parameters is $numParameters\n");
}

Программа напечатает:

The number of parameters is 6

The number of parameters is 3

The number of parameters is 26

Perl позволяет вам передавать в функцию любое число параметров. Функция сама может определить, какие параметры ей использовать, и в какой последовательности. Массив параметров @_ может использоваться так же, как и любой другой массив.

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

areaOfRectangle(2, 3);
areaOfRectangle(5, 6);
sub areaOfRectangle {
($height, $width) = @_ ;
$area = $height * $width;
print("The height is $height. The width is $width. The area is $area.\n\n");
}

Программа напечатает:

The height is 2. The width is 3. The area is 6.

The height is 5. The width is 6. The area is 30.

Если вы передаете в функцию не какое-либо число, а переменную, то в случае изменения ее значение внутри функции, она также изменяется и для всей остальной программы. Это называется передача параметров по ссылке.

@array = (0..5);

firstSub(@array);

sub firstSub{
$_ = "A";
$_ = "B";
}

Программа напечатает:

After fuNCtion call, array = A B 2 3 4 5

Как вы видите, функция изменила значение переданных ей параметров, и это повлияло также на работу остальной программы - значения массива @array изменились не только для функции, но и для всей остальной программы. Это плохая практика программирования - если у вас нет именно такой конкретной цели, то никогда не пользуйтесь подобными премами - они чреваты неочевидными ошибками. С другой стороны, если вы в начале функции присваиваете значения переданных параметров новым переменным (как было показано ранее), и работаете в дальнейшем только с ними - такой проблемы у вас не возникнет - ведь вы в данном случае на самом деле не изменяете значений переданных функции параметров.

Вот пример той же программы, но написанной более правильно:

@array = (0..5);
print("Before fuNCtion call, array = @array\n");
firstSub(@array);
print("After fuNCtion call, array = @array\n");
sub firstSub{

$firstVar = "A";
$secondVar = "B";
}

Программа напечатает:

Before fuNCtion call, array = 0 1 2 3 4 5

After fuNCtion call, array = 0 1 2 3 4 5

Как вы видите - функция присваивает значения переданных ей параметров новым переменным, и оперирует в дальнейшем только ими - не изменяя непосредственно массив параметров.

Но тогда вы можете столкнуться с другой проблемой:

$firstVar = 10;
@array = (0..5);
print("Before fuNCtion call\n");

print("\tarray = @array\n");
firstSub(@array);
print("After fuNCtion call\n");
print("\tfirstVar = $firstVar\n");
print("\tarray = @array\n");
sub firstSub{
($firstVar, $secondVar) = @_ ;
$firstVar = "A";
$secondVar = "B";
}

Программа напечатает:

Before fuNCtion call
firstVar = 10
array = 0 1 2 3 4 5

After fuNCtion call
firstVar = A
array = 0 1 2 3 4 5

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

Области действия переменных.

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

Иногда бывает очень полезным ограничить область действия той или иной переменной внутри какой-либо функции. В этом случае изменение значения переменной внутри функции никак не отразится на остальных частях программы. В Perl имеются две функции - my() и local(). Первая создает переменную, которая видна только внутри данной функции. Вторая создает переменную, которую также могут "видеть" функции, вызванные из данной функции.

firstSub("AAAAA", "BBBBB");
sub firstSub{
local ($firstVar) = $_;
my($secondVar) = $_;


secondSub();
print("firstSub: firstVar = $firstVar\n");
print("firstSub: secondVar = $secondVar\n\n");
}

Sub secondSub{


$firstVar = "ccccC";
$secondVar = "DDDDD";
print("secondSub: firstVar = $firstVar\n");
print("secondSub: secondVar = $secondVar\n\n");
}

Программа напечатает:

firstSub: firstVar = AAAAA
firstSub: secondVar = BBBBB
secondSub: firstVar = AAAAA
Use of uninitialized value at test.pl line 19.
secondSub: secondVar =
secondSub: firstVar = ccccC
secondSub: secondVar = DDDDD
firstSub: firstVar = ccccC
firstSub: secondVar = BBBBB

Как вы видите, функция secondSub() не имеет доступа к переменной $secondVar, которая была создана функцией my() внутри функции firstSub(). Perl даже вывел сообщение, предупреждая вас об этом. В то же время, переменная $firstVar доступна и может быть изменена функцией secondSub().

По возможности старайтесь обходиться только функцией my() и не использовать функцию local() - так вы обеспечите себе более строгий контроль над областью действия переменных.

На самом деле, функция my() гораздо более сложна и функциональна. Но об этом пойдет речь в главе 15 - "Модули Perl".

Вы помните, в чем разница между передачей параметров функции по ссылке и по значению? Если вы передаете параметры по значению, то функция не может изменять значения переданных ей параметров (переменных), а значит это никак не отразится на всей программе. Если же вы передаете параметры по ссылке, то функция может изменять значения параметров (переменных), и это отразится на основной программе. Так вот, при использовании функции local() метод передачи параметров по ссылке работает немного по-другому - функции могут менять значения переданных им параметров (переменных), но это отразится только на самой "верхней" функции - той, где была использована функция local(), - на основную же программу это никак не повлияет.

Использование списка в качестве параметра функции.

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

firstSub((0..10), "AAAA");
sub firstSub{
local(@array, $firstVar) = @_ ;

print("firstSub: firstVar = $firstVar\n");
}

Программа напечатает:

firstSub: array = 0 1 2 3 4 5 6 7 8 9 10 AAAA
Use of uninitialized value at test.pl line 8.
firstSub: firstVar =

Вы видите, что при инициализации переменных массив @array поглощает все элементы массива параметров @_, ничего не оставляя скаларной переменной $firstVar. Это подтверждает и предупреждающее сообщение интерпретатора Perl. Вы можете решить данную проблему путем перестановки местами параметров - если вы поставите сначала скалярную переменную, а потом массив, то все будет так как надо:

firstSub("AAAA", (0..10));
sub firstSub{
local($firstVar, @array) = @_ ;
print("firstSub: array = @array\n");
print("firstSub: firstVar = $firstVar\n");
}

Программа напечатает:

firstSub: array = 0 1 2 3 4 5 6 7 8 9 10
firstSub: firstVar = AAAA

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

Вложенные (рекурсивные) функции.

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

FirstSub();
sub firstSub{
print("$count\n");
$count++;
firstSub();
}

Программа напечатает:

Error: Runtime exception

Перед тем, как напечатать это сообшение об ошибке, программа будет увеличивать значение переменной $count до тех пор, пока будет возможен рекурсивный вызов функции. Таким образом, по значению переменной $count вы можете узнать, сколько уровней рекурсивных вызовов допускает ваша система.

Но не увлекайтесь рекурсией - этим стоит заниматься вплотную в особенных случаях, например, при некоторых математических рассчетах.

Частные функции.

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

$temp = performCalc(10, 10);
print("temp = $temp\n");
sub performCalc {
my ($firstVar, $secondVar) = @_;
my $square = sub {
return($_ ** 2);
};
return(&$square($firstVar) + &$square($secondVar));
};

Программа напечатает:

Как вы видите, у нас имеется функция $square. Точнее, $square - это обычная скалярная переменная, ссылающаяся на функцию. Для обращения к функции мы используем знак & перед именем переменной $square. Эту функцию мы можем использовать только внутри функции performCalc() - она недоступна для остальной программы.

: atan2 число1 , число2 Аргументы : число1 , число2 — числовые выражения Результат : числовое значение

Функция atan2 возвращает арктангенс частного от деления числа1 на число2 . Результат находится в диапазоне от -π до +π и соответствует величине угла в радианах между осью абсцисс и вектором до точки с координатами (число2 , число1 ). Примеры:

$x = atan2 -0, -1; # x равно -3.14159265358979 $x = atan2 -1, 0; # x равно -1.5707963267949 $x = atan2 0, 1; # x равно 0 $x = atan2 1, 1; # x равно 0.785398163397448 $x = atan2 1, 0; # x равно 1.5707963267949 $x = atan2 0, -1; # x равно 3.14159265358979

Функция cos

Синтаксис : cos число Аргументы : число — числовое выражение Результат : числовое значение

Функция cos возвращает косинус числа . Если аргумент опущен, то число

$pi = atan2 0, -1; $x = cos 0; # x равно 1 $x = cos $pi/2; # x равно 6e-17 (почти 0) $x = cos $pi; # x равно -1

Функция exp

Синтаксис : exp число Аргументы : число — числовое выражение Результат : числовое значение

Функция exp возвращает экспоненту числа . Если аргумент опущен, то число принимается равным значению переменной $_ . Если число больше 709.78, то возвращается 1.#INF. Пример:

Print exp 1; # 2.71828182845905

Функция int

Синтаксис : int число Аргументы : число — числовое выражение Результат : числовое значение

Функция int возвращает целую часть числа . Если аргумент опущен, то число

Print int 1.5; # 1 print int -1.5; # -1

Функция log

Синтаксис : log число Аргументы : число — числовое выражение Результат : числовое значение

Функция log возвращает натуральный логарифм числа . Если аргумент опущен, то число

Print log 2.71828182845905; # 1

Функция rand

Синтаксис : rand число Аргументы : число — числовое выражение Результат : числовое значение

Функция rand возвращает случайное число, большее или равное нулю и меньшее числа , которое должно быть положительным. Если аргумент опущен, то число принимается равным 1. Если функция еще не вызывалась, то автоматически вызывает ее.

Функция sin

Синтаксис : sin число Аргументы : число — числовое выражение Результат : числовое значение

Функция sin возвращает синус числа . Если аргумент опущен, то число принимается равным значению переменной $_ . Примеры:

$pi = atan2 0, -1; $x = sin 0; # x равно 0 $x = sin $pi/2; # x равно 1 $x = sin -$pi/2; # x равно -1

Функция sqrt

Синтаксис : sqrt число Аргументы : число — числовое выражение Результат : числовое значение

Функция sqrt возвращает квадратный корень из числа . Если аргумент опущен, то число принимается равным значению переменной $_ . Если аргумент меньше или равен нулю, то возникает фатальная ошибка исполнения. Пример:

Print sqrt 2; # 1.4142135623731

Функция srand

Синтаксис : srand число Аргументы : число — числовое выражение

Функция srand инициализирует генератор случайных чисел . Если ее аргумент опущен, то число генерируется исполняющей системой. Начиная с PERL 5.004, явный вызов этой функции не нужен, т. к. теперь она автоматически вызывается функцией rand() при первом обращении к ней.

6.9.2. Строковые функции

Функция chomp

Синтаксис : chomp строка chomp список Аргументы : строка — строковое выражение список Результат : числовое значение

Функция chomp удаляет из строки концевую подстроку, соответствующую текущему разделителю записей, т. е. содержимому переменной $/ . Если аргументом является список , то эта функция применяется к каждому элементу списка. Если аргумент опущен, то строка принимается равной значению переменной $_ . Результатом функции является общее количество удаленных символов.

Ее основным применением является удаление концевых символов перевода строки при построчном чтении текстового файла, например:

While (<>) { chomp; # удаляем \n в конце считанной строки $_ . . . }

Если $\ равно undef или содержит ссылку на число (для записей фиксированной длины), то эта функция ничего не удаляет.

Функция chop

Синтаксис : chop строка chop список Аргументы : строка — строковое выражение список — список строковых выражений Результат : строковое значение

Функция chop удаляет из строки ее последний символ и возвращает его. Если аргументом является список , то эта функция применяется к каждому элементу списка и возвращает последний из удаленных символов. Если аргумент опущен, то строка

$_ = "abcde"; chop; print; # выводит "abcd"

Функция crypt

Синтаксис : crypt строка , код Аргументы : строка , код — строковые выражения Результат : строковое значение

Функция crypt кодирует исходную строку с помощью строки код и возвращает результат. Код должен состоять из двух символов, лежащих в диапазоне [./0-9A-Za-z] . Парной функции декодировки в PERL"е нет, поэтому практического применения эта функция не имеет.

Функция index

Синтаксис : index строка , подстрока , позиция ? Аргументы : строка , подстрока — строковые выражения позиция — числовое выражение Результат : числовое значение

Функция index ищет в строке заданную подстроку , начиная с заданной позиции или с начала строки, если позиция

$str = "Queen Mary"; print index($str, "Mary"); # 6 print index($str, "mary"); # -1

Функция lc

Синтаксис : lc строка Аргументы : строка — строковое выражение Результат : строковое значение

Функция lc преобразует все символы строки в строчные буквы. Если аргумент опущен, то строка

Print lc "ABCDE"; # abcde

Функция lcfirst

Синтаксис : lcfirst строка Аргументы : строка — строковое выражение Результат : строковое значение

Функция lcfirst преобразует первый символ строки в строчную букву. Если аргумент опущен, то строка принимается равной значению переменной $_ . Если использована директива use locale , то преобразование производится с учетом текущей национальной настройки. Пример:

Print lcfirst "ABCDE"; # aBCDE

Функция length

Синтаксис : length строка Аргументы : строка — строковое выражение Результат : числовое значение

Функция length возвращает количество символов в строке . Если аргумент опущен, то строка принимается равной значению переменной $_ . Пример:

Print length "ABCDE"; # 5

Функция rindex

Синтаксис : rindex строка , подстрока , позиция ? Аргументы : строка , подстрока — строковые выражения позиция — числовое выражение Результат : числовое значение

Функция rindex ищет в строке заданную подстроку справа налево, начиная с заданной позиции или с конца строки, если позиция опущена. Она возвращает позицию найденной подстроки в исходной строке или -1, если подстрока не найдена. Пример:

Print rindex("abcabc", "abc"); # 3

Функция substr

Синтаксис : substr строка , смещение , длина ?, замена ? Аргументы : строка , замена — строковые выражения смещение , длина — числовые выражения Результат : строковое значение

Функция substr возвращает подстроку строки заданной длины , начиная с заданного смещения . Если смещение отрицательно, то оно отсчитывается от конца строки. Если длина опущена, то извлекаются символы до конца строки; если она отрицательна, то она складывается с длиной строки. Пример:

Print substr("abcdef", 1, -2); # bcd

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

$str = "abcdef"; substr($str, 1, -2,"xxx"); print $str; # axxxef

Этот пример можно записать и так:

$str = "abcdef"; substr($str, 1, -2) = "xxx"; print $str; # axxxef

Функция uc

Синтаксис : uc строка Аргументы : строка — строковое выражение Результат : строковое значение

Функция uc преобразует все символы строки в прописные буквы. Если аргумент опущен, то строка принимается равной значению переменной $_ . Если использована директива use locale , то преобразование производится с учетом текущей национальной настройки. Пример:

Print uc "abcde"; # ABCDE

Функция ucfirst

Синтаксис : ucfirst строка Аргументы : строка — строковое выражение Результат : строковое значение

Функция ucfirst преобразует первый символ строки в прописную букву. Если аргумент опущен, то строка принимается равной значению переменной $_ . Если использована директива use locale , то преобразование производится с учетом текущей национальной настройки. Пример:

Print ucfirst "abcde"; # Abcde

6.9.3. Прочие скалярные функции

Функция chr

Синтаксис : chr код Аргументы : код — числовое выражение Результат : строковое значение

Функция chr возвращает символ, имеющий заданный числовой код . Если аргумент опущен, то код принимается равным значению переменной $_ . Пример:

Print chr 65; // A

Функция hex

Синтаксис : hex строка Аргументы : строка — строковое выражение Результат : числовое значение

Функция hex преобразует строку в шестнадцатеричное число. Если аргумент опущен, то строка принимается равной значению переменной $_ . Например, все приведенные ниже операторы выведут на экран число 165:

Print hex "0xaf"; print hex "xaf"; print hex "0af"; print hex "af";

Функция oct

Синтаксис : oct строка Аргументы : строка — строковое выражение Результат : числовое значение

Функция oct преобразует строку в число. Если строка начинается с "0x", то она интерпретируется как шестнадцатеричное число; если она начинается с "0b", то интерпретируется как двоичное число; в остальных случаях она интерпретируется как восьмеричное число. Если аргумент опущен, то строка принимается равной значению переменной $_ . Примеры:

Print oct "0xaf"; # 165 print oct "0b101"; # 5 print oct "0100"; # 64 print oct "100"; #64

Функция ord

Синтаксис : ord строка Аргументы : строка — строковое выражение Результат : числовое значение

Функция ord возвращает числовой код первого символа строки . Если аргумент опущен, то строка принимается равной значению переменной $_ . Пример:

Print ord "ABC"; # 65

Функция pack

Синтаксис : pack шаблон , список Аргументы : шаблон — строковое выражение список — список скалярных выражений Результат : строковое значение

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

Символ Результат
a Произвольная строка, в конце добавить нулевой байт.
A Строка ASCII, в конце добавить пробел.
Z Строка ASCII, в конце добавить нулевой байт.
b Битовая строка, биты в байте упаковываются с младшего бита.
B Битовая строка, биты в байте упаковываются со старшего бита.
h Шестнадцатеричная строка, младшая тетрада идет первой.
H Шестнадцатеричная строка, старшая тетрада идет первой.
c Однобайтовое целое со знаком.
C Однобайтовое целое без знака.
s Двухбайтовое целое со знаком.
S Двухбайтовое целое без знака.
i Целое со знаком (число байтов зависит от архитектуры).
I Целое без знака (число байтов зависит от архитектуры).
l Четырехбайтовое целое со знаком.
L Четырехбайтовое целое без знака.
n Двухбайтовое целое без знака, старший байт идет первым.
N Четырехбайтовое целое без знака, старший байт идет первым.
v Двухбайтовое целое без знака, младший байт идет первым.
V Четырехбайтовое целое без знака, младший байт идет первым.
q Восьмибайтовое целое со знаком.
Q Восьмибайтовое целое без знака.
f Плавающее число обычной точности, формат зависит от архитектуры.
d Плавающее число двойной точности, формат зависит от архитектуры.
p Указатель на строку с завершающим нулевым байтом.
P Указатель на структуру фиксированной длины.
u Строка в кодировке uuencode.
U Строка в кодировке UTF-8.
w Сжатое целое формата BER.
x Нулевой байт.
X Дублировать байт.
@ Заполнение нулями до указанной позиции.

Шаблоны подчиняются следующим правилам:

  • За буквой может следовать число, задающее счетчик повторений. Для всех типов, кроме a, A, Z, b, B, h, H, P , извлекается соответствующее количество элементов списка . Если счетчик задан символом * , это означает упаковку всех оставшихся элементов списка (за исключением @, x, X , где этот символ эквивалентен 0, и u , где он эквивалентен 1). Z* означает добавление дополнительного нулевого байта в конец строки. Счетчик повторений для u интерпретируется как максимальное число байтов, которое должно кодироваться в одной строке вывода; при этом 0 и 1 заменяются на 45.
  • Типы a, A, Z всегда извлекают из списка одно значение. Счетчик повторений для них означает длину упакованной строки. Если строка длиннее счетчика, то она усекается; если короче, то дополняется нулями (a, Z) или пробелами (A). При упаковке a и Z эквивалентны; при распаковке A удаляет из строки концевые пробелы и нулевые байты, Z удаляет все после первого нулевого байта, a ничего не удаляет.
  • Типы b и B преобразуют каждый из входных байтов в один бит результата. Результирующий бит равен 0 или 1 в зависимости от значения младшего бита исходного байта. Счетчик повторений задает количество упаковываемых байтов. При этом b упаковывает получаемые биты в байт результата, начиная с младшего его бита, а B — со старшего. Если длина исходной строки не делится на 8, то результат дополняется нулевыми битами. При распаковке эти лишние биты игнорируются. Если входная строка длиннее счетчика, то она усекается. * в качестве счетчика повторений означает использование всех байтов входного поля. При распаковке биты преобразуются в байты "0" и "1".
  • Для типов h и H счетчик повторений означает количество упаковываемых шестнадцатеричных цифр (тетрад). Каждый из входных байтов преобразуется в одну тетраду результата. При этом байты "0"… "9", "a"…"f", "A"…"F" заменяются на соответствующие шестнадцатеричные цифры, а остальные байты на свою младшую тетраду. Тип h упаковывает получаемые тетрады в байт результата, начиная с младшего его тетрады, а H — со старшей. Если длина исходной строки нечетна, то результат дополняется нулевой тетрадой. При распаковке лишняя тетрада игнорируются. Если входная строка длиннее счетчика, то она усекается. * в качестве счетчика повторений означает использование всех байтов входного поля. При распаковке тетрады преобразуются в строку шестнадцатеричных цифр.
  • Тип p упаковывает указатель на строку, оканчивающуюся нулевым байтом, а P — указатель на структуру фиксированной длины, заданной счетчиком повторений. Если значение соответствующего указателя равно undef , то упаковывается нуль.
  • Символ / вместо счетчика повторений позволяет упаковать перед строкой ее длину. Например, шаблон "n/a*" означает, что результат будет состоять из двухбайтового числа, содержащего длину исходной строки, и самой строки.
  • При упаковке не производится никакого выравнивания получаемых значений.
  • Шаблон может содержать комментарий, который начинается с символа # и продолжается до конца строки.
  • Если шаблон требует больше аргументов, чем содержится в списке , то список дополняется пустыми строками "" . Если шаблон требует меньше аргументов, чем содержится в списке , то лишние аргументы игнорируются.

$foo = pack("CCCC",65,66,67,68); # $foo = "ABCD" $foo = pack("C4",65,66,67,68); # $foo = "ABCD" $foo = pack("aaaa","abc","x","y","z"); # $foo = "axyz" $foo = pack("a14","abcdefg"); # "abcdefg\0\0\0\0\0\0\0" $foo = pack("s2",1,2); # $foo = "\1\0\2\0" в IBM PC, "\0\1\0\2" в Mac

Функция unpack

Синтаксис : unpack шаблон , строка Аргументы : шаблон , строка — строковые выражения Результат : массив значений

Функция pack распаковывает строку , упакованную функцией . Она возвращает массив полученных в результате значений (в скалярном контексте возвращает первое полученное значение). Правила распаковки задаются строкой шаблон , строение которой то же, что и для . Дополнительно шаблон может содержать перед буквой, задающей тип распаковки, префикс %n , который указывает, что мы хотим получить не результат распаковки, а его n -битовую контрольную сумму. Остальные подробности см. в описании функции . Следующий пример демонстрирует эффективный способ подсчета количества единичных битов в переменной $mask:

$setbits = unpack("%32b*", $mask);

Функция vec

Синтаксис : vec выражение , смещение , ширина Аргументы : выражение — строковое выражение смещение , ширина — числовые выражения Результат : числовое значение

Функция vec рассматривает строку выражение как массив, состоящий из элементов заданной ширины в битах. Она извлекает элемент с заданным смещением и возвращает его. Ширина должна степенью числа 2 в диапазоне от 1 до 32 (или 64 на 64-битовых платформах), смещение трактуется как целое число без знака. Пример:

$x = "\x10\x32\x54"; # $x = (0, 1, 2, 3, 4, 5) как вектор 4-битовых чисел print vec($x, 2, 4); # поэтому будет выведено число 2

Функция vec может использоваться в левой части оператора присваивания для формирования массива битовых групп в строке. Например, мы могли бы сформировать приведенную выше строку $x так:

Функция quotemeta добавляет в строку аргумента символ "\" перед каждым символом, не являющимся латинской буквой или цифрой, и возвращает новую строку в качестве результата. Если аргумент опущен, то он принимается равным значению переменной $_ . Это внутренняя функция, которая реализует метасимвол \Q . Пример:

Print quotemeta "abc123абв"; # "abc123\а\б\в"

Функция split

Синтаксис : split образец , строка , предел Аргументы : образец — регулярное выражение строка — строковое выражение предел — числовое выражение Результат : список строк

Функция split расщепляет исходную строку на подстроки и возвращает список этих подстрок. В скалярном контексте она заносит список подстрок в массив @_ и возвращает его длину. Если строка опущена, то она принимается равной значению переменной $_ . Разбиение на подстроки происходит в позициях сопоставления с заданным образцом ; если он опущен, то разбиение производится по символу пробела, при этом начальные пробелы в каждой подстроке удаляются. Если образец содержит круглые скобки, то подстроки, сопоставляемые с выражением в скобках, включаются в результирующий список как отдельные элементы.

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

@_ = split(/,/, "a,b,c,d,"); # @_ = ("a", "b", "c", "d") @_ = split(/,/, "a,b,c,d,", 3); # @_ = ("a", "b", "c,d,") @_ = split(/,/, "a,b,c,d,", -3); # @_ = ("a", "b", "c", "d", "") @_ = split(/(,)/, "a,b,c,d,"); # @_ = ("a", ",", "b", ",", "c", ",", "d", ",")

Функция study

Синтаксис : study строка Аргументы : строка — строковое выражение Результат : нет

Функция study компилирует строку (или значение переменной $_ , если она опущена) во внутреннее представление. Если строку предполагается многократно сопоставлять с образцом, то ее компиляция может сэкономить время при последующих операциях сопоставления. В каждый момент времени только одна строка может быть скомпилирована; применение функции study к другой строке отменяет компиляцию текущей строки. Пример:

While (<>) { study; print "Мое\n" if /\bменя\b/; print "Твое\n" if /\bтебя\b/; ... }

Проблема

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

Решение

Получение ссылки на функцию: $cref = \&func; $cref = sub {...}; Вызов функции по ссылке: @returned = $cref->(@arguments); @returned = &$cref (@arguments);

Комментарий

Чтобы получить ссылку на функцию, достаточно снабдить ее имя префиксом \&. Кроме того, формулировка sub {} позволяет создавать анонимные функции. Ссылка на анонимную функцию может быть сохранена так же, как и любая другая. В Perl 5.004 появилась постфиксная запись для разыменования ссылок на функции. Чтобы вызвать функцию по ссылке, раньше приходилось писать &$funcname (@ARGS), где $funcname - имя функции. Возможность сохранить имя функции в переменной осталась и сейчас: $funcname = "thefunc"; &$funcname(); однако подобное решение нежелательно по нескольким причинам. Во-первых, в нем используются символические, а не настоящие (жесткие) ссылки, поэтому при действующей директиве use strict "refs" оно отпадает. Символические ссылки обычно не рекомендуются, поскольку они не могут обращаться к лексическим, а только к глобальным переменным, и для них не ведется подсчет ссылок. Во-вторых, оно не содержит данных о пакете, поэтому выполнение фрагмента в другом пакете может привести к вызову неверной функции. Наконец, если функция была в какой-то момент переопределена (хотя это происходит нечасто), символическая ссылка будет обращаться к текущему определению функции, а жесткая ссылка сохранит старое определение. Вместо того чтобы сохранять имя функции в переменной, создайте ссылку на нее с помощью оператора \. Именно так следует сохранять функцию в переменной или передавать ее другой функции. Ссылки на именованные функции можно комбинировать со ссылками на анонимные функции: %commands = ("happy" => \&joy, "sad" => \&sullen, "done" => sub { die "See ya!" }, "mad" => \&angry,); print "How are you?"; chomp ($string = ); if ($commands{$string}) { $commands{$string}->(); } else { print "No such command: $string\n"; } Если вы создаете анонимную функцию, которая ссылается на лексическую (mу) переменную из вмещающей области действия, схема подсчета ссылок гарантирует, что память лексической переменной не будет освобождена при наличии ссылок на нее: sub counter_maker { my $start = 0; return sub { # Замыкание return $start++; # Лексическая переменная }; # из вмещающей области действия } $counter = counter_maker(); for ($i =0; $i Даже несмотря на то что функция counter_maker завершилась, а переменная $start вышла из области действия, Perl не освобождает ее, поскольку анонимная подпрограмма (на которую ссылается $counter) все еще содержит ссылку на $start. Если повторно вызвать counter_maker, функция вернет ссылку на другую анонимную подпрограмму, использующую другое значение $start: $counter1 = counter_maker(); $counter2 = counter_maker(); for ($i = 0; $i 0 1 2 3 4 5 0 Замыкания часто используются в косвенно-вызываемых функциях (callbacks). В графических интерфейсах и вообще в программировании, основанном на событиях, определенные фрагменты кода связываются с событиями нажатий клавиш, щелчков мышью, отображения окон и т. д. Этот код вызывается много позже, возможно, из совсем другой области действия. Переменные, используемые в замыкании, должны быть доступными к моменту вызова. Для нормальной работы они должны быть лексическими, а не глобальными. Замыкания также используются в генераторах функций, то есть в функциях, которые создают и возвращают другие функции. Функция counter_maker является генератором. Приведем еще один простой пример: sub timestamp { my $start_time = time (); return sub { return time() - $start_time }; } $early = timestamp(); sleep 20; $later = timestamp(); sleep 10; printf "It"s been %d seconds since early.\n", $early->(); printf "It"s been %d seconds since later.\n", $later->(); It"s been 30 seconds since early. It"s been 10 seconds since later. Каждый вызов timestamp генерирует и возвращает новую функцию. Функция timestamp создает лексическую переменную $start_time, которая содержит текущее время (в секундах с начала эпохи). При каждом вызове замыкания оно возвращает количество прошедших секунд, которое определяется вычитанием начального времени из текущего.

Встпвляет пространство имен одного модуля в другой. Это не встроенная функция, а всего лищь метод, наследуемый от модуля (параметр МОДУЛЬ), которому необходимо экспортировать свои имена (параметр СПИСОК) в другой модуль.

Import МОДУЛЬ СПИСОК

local

Функция local() используется для объявления и инициализации одной или нескольких переменных:

Local EXPR local ($myvar, , %myhash); local $pi = 3.14159; local ($pi, $exp) = (3.14159, 2.71828);

но, в отличие от функции my() она создает не локальные переменные, а временные значения для глобальных переменных внутри:

  • подпрограммы;
  • заключенного в фигурные скобки блока операторов;
  • выражения, пареданного на выполнение функции eval();
  • файла;

В зависимости от того, в каком месте вызвана для объявления переменных сама функция local(). Если функция local() применяется для описания нескольких переменных, они должны быть заключены в скобки. Если глобальня перемнная, объявленная при помощи этой функции, ранее встречалась до объявления и имела некоторое значение, то это значение сохраняется в скрытом стеке и восстанавливается после выхода соответственно из подпрограммы, блока, функции eval() или файла. Переменная, объявленная при помощи функции local(), или, точнее, ее временное значение, доступна для любой функции, вызванной внутри подпрограммы, блока, функции eval() или файла, в которых сделано объявление. Такую переменную называют динамической, а ее область видимости - динамической областью видимости. В названии отражается тот факт, что область видимости переменной динамически изменяется с каждым вызовом функции, получающей доступ к этой переменной.

Пример:

my

Функция my() используется для объявления одной или нескольких переменных локальными:

и ограничивает их область действия:

  • подпрограммой;
  • заключенным в фигурные скобки блоком операторов;
  • выражением, пареданным на выполнение функции eval();
  • файлом, в зависимости от того, в каком месте вызвана для объявления переменных сама функция my().

Если выражение EXPR содержит список переменных, то он должен быть заключен в скобки:

My ($myvar, @mylist, %myhash);

Одновременно с объявлением переменные могут быть инициализированны:

My $pi = 3.14159; my ($pi, $exp) = (3.14159, 2.71828);

Переменные, объявленные при помощи функции my(), доступны в своей области действия только для подпрограмм, определенных в этой области. Для подпрограмм, определенных за ее пределами, они недоступны. Такие переменные называются лексическими, а саму область видимости - лексической или статической областью видимости.

Пример:

Sub f1{ local ($x) = "aaaa"; my($y) = "bbbb"; print("f1: x = $xn"); print("f1: y = $ynn"); f2(); print("f1: x = $xn"); print("f1: y = $ynn"); } sub f2{ print("f2: x = $xn"); print("f2: y = $ynn"); $x = "cccc"; $y = "dddd"; print("f2: x = $xn"); print("f2: y = $ynn"); } f1;

Результатом выполнения данного примера будет следующий вывод:

F1: x = aaaa f1: y = bbbb f2: x = aaaa f2: y = f2: x = cccc f2: y = dddd f1: x = cccc f1: y = bbbb

Как видно из приведенного результата, функция f2() не имеет доступа к переменной $y, объявленной при помощи функции my() внутри функции f1(), и,напртив, имеет доступ к переменной $x, объявленной внутри f1() при помощи функции local().

package

Определяет отдельное глобальное пространство имен (пакет): все неопределенные динамические идентификаторы (включая те, которые объявлены через local(), но не my()) будут храниться в нем. Для доступа к ним вне пакета следует указывать префикс, представляющий имя пакета с последующими двумя символами двоеточий "::". Область видимости переменных пакета распространяется до конца блока операторов, в котором расположен пакет или до нового объявления пакета. Если опущено имя пакета, то предписывает, чтобы все индентификаторы были определены, включая имена функций.

Package [ИМЯ_ПАКЕТА]

use

Загружает модуль во время компиляции; если модуль не доступен, то компиляция всей программы прекращается.

Use МОДУЛЬ СПИСОК use МОДУЛЬ use МОДУЛЬ ВЕРСИЯ СПИСОК use ВЕРСИЯ