Если у вас имеется много подпрограмм, особенно
подпрограмм,
которые вы храните в различных файлах, то может
возникнуть колли-
зия имен переменных, когда одно и то же имя
переменной ис-
пользуется в различных целях. Perl помогает
избежать этого с по-
мощью пакетов (packages). Как известно, объявляя
локальные пере-
менные для подпрограмм, можно избежать коллизии
имен. Однако ес-
ли несколько подпрограмм совместно используют
какие-то специфи-
ческие данные, то эти данные могут потребовать
глобальной облас-
ти видимости, что как раз и может вести к коллизии
имен.
Используя пакеты, можно группировать глобальные
данные в частные
пространства имен (name-spaces), вне пределов которых
глобальные
переменные не видны, т. е. неизвестны. Рассмотрим
приведенный ни-
же простой пример, в котором две подпрограммы
(находящиеся в раз-
личных файлах) используют частные,
индивидуальные пространства
имен.
# Код в файле one.pl
sub sub_one
{
package demo_one;
$some_data = 10;
}
# * * * * * * * *
# Код в файле two.pl
sub sub_one
{
package demo_two;
$some_data = 20;
}
Как можно видеть, первая подпрограмма использует
имя пакета
demo_one, вторая подпрограмма использует имя пакета
demo_two. Обе
подпрограммы могут устанавливать и использовать
переменную
$some_data без возникновения коллизии имен между
одной и другой
глобальными переменными.
Скрипт <знает> имя пакета, в пределах которого
находится пе-
ременная, и он организует доступ к ней,
использует имя пакета в
качестве префикса к имени переменной. В
следующем примере имя па-
кета package_one или package_two добавляется в качестве
префикса
к имени переменной some_data:
Когда вы используете пакеты языка Perl, можете
создать уни-
кальное пространство имен в пределах текущего
файла исходных ко-
дов путем помещения инструкции package в начале
файла, как пока-
зано ниже:
package some_package_name
$some_data = 1;
sub some_sub
{
return $some_data;
}
В данном случае переменная $some_data существует
только в
пакете и поэтому защищена от некорректного
доступа. Использова-
ние пакета, таким образом, обеспечивает данным ту
же область ви-
димости, что и в языке программирования С, где
глобальные пере-
менные имеют своей областью видимости тот файл
исходных кодов, в
котором они объявлены. При вызове подпрограммы
из другого файла
скриптов необходимо использовать имя пакета:
ОБРАБОТКА СТРОК
В предыдущих примерах вы научились построению
строковых ли-
тералов, используя интерполяцию переменных. Вы
также научились
выполнять соединение строковых литералов и
строковых переменных.
В этом разделе вы видите, что Perl предоставляет
большой набор
функций, с помощью которых скрипты могут
манипулировать строками.
ФУНКЦИЯ CHOP
Функция chop удаляет последний символ строки. Она
имеет сле-
дующий формат:
$character = chop(Str);
Функция chop возвращает удаленный символ. Скрипты
языка Perl
широко используют chop для удаления символа
перехода на новую
строку и символа конца строки.
ФУНКЦИЯ INDEX
Функция index осуществляет поиск заданной
подстроки в стро-
ке. Она имеет следующий формат:
$location = index(Str, SubStr[, Offset]);
Функция index возвращает индекс первого вхождения
подстроки
(SubStr) в строку (Str). Факультативно может быть задан
сдвиг от
начала (Offset), после которого начинается поиск.
Если подстрока
не найдена, возвращается значение -1. В следующем
примере фун-
кция index ищет вхождения подстроки 'па' после
третьего символа в
строке 'banana':
print index('banana','na',3); # Выведет 4.
i -
ФУНКЦИЯ RINDEX
Функция rindex ищет последнее, самое правое
вхождение под-
строки в строку и возвращает значение позиции
первого символа
подстроки. Функция имеет следующий формат:
$location = rindex(Str, SubStr);
Эта функция аналогична функции index, за
исключением того,
что она возвращает последнее вхождение, а не
первое. Например, в
следующем примере функция rindex используется для
определения
последнего вхождения подстроки 'na' в строку 'banana':
print rindex('banana','na'); # Выведет 4
ФУНКЦИЯ LENGTH
Функция length возвращает число символов в строке.
Она имеет
следующий формат:
$len = length(Str);
В следующем примере функция length используется для
вывода
числа символов в строке:
print length('banana'); # Выведет 6
ФУНКЦИЯ SUBSTR
Функция substr используется для удаления части
строки. Она
имеет следующий формат:
$substring = substr(Str, Offset[,Len]);
Функция возвращает подстроку, т. е. часть строки,
длина ко-
торой не превышает величины, заданной
факультативным параметром
Len. Возвращаемая подстрока строки str начинается с
символа в по-
зиции, заданной сдвигом Offset. Если параметр Len
опущен, то воз-
вращаемая строка содержит символы до конца
строки включительно.
Если параметр Offset отрицательный, то сдвиг
вычисляется от кон-
ца строки. Наконец, скрипт может использовать substr
как lvalue
для выполнения операции присваивания. Следующий
фрагмент кода ил-
люстрирует использование функции substr.
Примечание: Часто использование операторов
языка Perl для регу-
лярных выражений оказывается более эффективным,
чем функции
substr. Регулярные выражения обсуждаются ниже в
данной главе.
ФУНКЦИЯ JOIN
Функция join соединяет список элементов в строку,
разделяя
каждый элемент заданным символом. Она имеет
следующий формат:
$new_string = join(Str,List);
Функция join конвертирует каждый элемент списка в
строку и
соединяет строки. Следующий фрагмент кода
иллюстрирует использо-
вание функции join:
$str = join(',', 0..4,10,20); # Список будет '0,1,2,3,4,10,20'
$strn = join ("\t", $a, $b, $c);# Смешает списки
ФУНКЦИЯ SPLIT
Функция split разделяет содержимое строки на
список элемен-
тов. Она имеет следующий формат:
split(Delimeter, Str[,Limit]);
Аргумент Delimeter определяет символ, по которому
осущес-
твляется разделение, например, пробел, слово,
символ табуляции и
т. д. Факультативный параметр Limit задает
максимальное число
элементов, которое может содержать список.
Следующий пример ил-
люстрирует использование функции split.
ФУНКЦИИ ДЛЯ ОБРАБОТКИ СПИСКОВ
В рассмотренных ранее в этой главе примерах мы
познакоми-
лись с тем, как создать список, сохранить его в
качестве значе-
ния переменной, организовать итерации по всем
элементам списка и
получить доступ к индивидуальному элементу
списка. В этом разде-
ле вы познакомитесь еще с несколькими функциями,
которые расши-
ряют набор возможностей для работы со списками.
ФУНКЦИЯ REVERSE
Функция reverse реверсирует элементы списка. Она
имеет сле-
дующий формат:
@new_list = reverse(@List);
Функция reverse реверсирует список и возвращает
новый ре-
зультирующий список. Следующий пример
иллюстрирует использование
функции reverse:
@list = reverse(1..5); # Результат 5,4,3,2,1
@list = reverse(@list); # Результат 1,2,3,4,5
ФУНКЦИЯ SORT
Функция sort сортирует элементы списка. Она имеет
следующий
формат:
@new_list = sort(@List);
или
@new_list = sort(Subroutine @List);
или
@new_list = sort(BlockStatement @List);
Функция sort размещает элементы в списке,
упорядочивая их в
соответствии с порядковыми номерами символов в
таблице ASCII-ко-
дов. Так же как и функция reverse, функция sort
возвращает в ка-
честве значения новый список и не воздействует
на исходный спи-
сок. Следующий пример иллюстрирует
использование функции sort:
@list = sort (1,5,2,3,4); # Результат 1,2,3,4,5
@list = sort(1,2,10); # 1,10,2 сортировка в ASCII
В подпрограмме или блоке можно изменять
упорядочение, в
соответствии с которым выполняется сортировка.
Следующий пример
иллюстрирует использование функции sort.
ФУНКЦИИ РАБОТЫ С МАССИВАМИ
Как известно, массив представляет собой
структуру данных,
содержащую одно или несколько значений величин
одного типа, нап-
ример, 100 имен студентов. Perl содержит несколько
встроенных
функций, которые помогают работать с элементами
массива. В сле-
дующих разделах рассматривается несколько
основных функций для
обработки массивов.
ФУНКЦИИ PUSH И POP
Скрипты языка Perl используют фикции push и pop для
того,
чтобы добавлять и удалять элементы с конца
массива. Иными слова-
ми, функции push и pop позволяют скриптам выполнять
операции со
стеком по принципу: последним вошел, первым
вышел. Функция push
имеет следующий формат:
push(@ARRAY, LIST);
Следующий фрагмент иллюстрирует использование
функции push:
@list = ();
push(@list,10,20); # @list теперь (10,20)
push(@list,1..3); # @list теперь (10,20,1,2,3)
В противоположность этому функция pop удаляет
элемент, кото-
рый был вставлен в стек последним и возвращает
значение этого
элемента. Функция pop имеет следующий формат:
$value = pop(@ARRAY);
Следующий фрагмент программы иллюстрирует
использование фун-
кции pop:
ФУНКЦИЯ SHIFT
Функция shift удаляет и возвращает элемент из
начала масси-
ва. Эта функция аналогична функции pop с тем только
отличием, что
работает от начала массива по принципу FIFO
(<первым вошел, пер-
вым вышел>). Функция shift имеет следующий формат:
$value = shift(@ARRAY);
Следующий фрагмент программы иллюстрирует
использование фун-
кции shift:
ФУНКЦИЯ SPLICE
Скрипты языка Perl используют функцию splice для того,
что-
бы извлекать элементы из списка, заменяя их
элементами другого
списка. Она имеет следующий формат:
splice(@Array, Offset[, Count[, List]]);
Функция splice извлекает указанное число элементов
{Count)
из массива (@Аrraу), начиная с элемента, на который
указывает ве-
личина сдвига (Offset), и заменяет элементы
элементами другого
списка (List). Если в вызове функции не указан
параметр Count,
функция извлекает элементы до самого конца
массива. Если в вызо-
ве функции не указан список, элементами которого
замещаются ис-
ходные элементы, то функция не добавляет никаких
элементов к пер-
воначальному списку. Следующее выражение
иллюстрирует использова-
ние функции splice:
ФУНКЦИЯ SCALAR
Функция scalar определяет число элементов в списке.
Она
имеет следующий формат:
Rsult = scalar(List);
Обычно скрипты языка Perl не нуждаются в
использовании фун-
кции scalar применительно к массивам, потому что
когда скрипт об-
ращается к массиву, записывая его в скалярном
контексте, то он
получает в качестве возвращаемой величины число
элементов масси-
ва. Тем не менее, скрипты могут использовать
функцию scalar в
случаях, когда контекст является неоднозначным
или если список не
является массивом. Следующее выражение
иллюстрирует использова-
ние функции scalar.
@list = 1..10;
print scalar(@list); # Выведет размер @list
ФУНКЦИЯ GREP
Функция grep фильтрует элементы списка, для
которых задан-
ное выражение принимает значение <ложно>. Она
имеет следующий
формат:
@list = grep(Expression, List);
Функция grep просматривает элементы списка,
подставляя их в
качестве аргумента в заданное выражение. Функция
grep присваи-
вает текущее выражение элемента списка
переменной $_ и вычисляет
заданное выражение. Если полученное выражение
является истинным,
то функция grep добавляет этот элемент к
результирующему списку.
Следующий фрагмент программы иллюстрирует
использование функции
grep:
Примечание: Если выражение, модифицирует
переменную. $_, то ис-
ходный список также будет модифицирован.
ФУНКЦИИ ОБРАБОТКИ АССОЦИАТИВНЫХ МАССИВОВ
Как известно, ассоциативные массивы - это такие
массивы, у
которых индексом является не числовая величина,
а, например, имя.
В языке Perl имеется несколько встроенных функций,
которые упро-
щают обработку скриптами ассоциативных
массивов.
ФУНКЦИЯ KEYS
Функция keys возвращает значения ключей, которые
отвечают
ассоциативному массиву. Она имеет следующий
формат:
@key_list = keys(%Array);
Функция keys возвращает массив ключей в виде
регулярного
списка. Следующий фрагмент программы
иллюстрирует использование
функции keys:
for $key (sort keys %ages)
{
print "$key is $ages{$key}\n"
}
ФУНКЦИЯ VALUES
Функция values возвращает обычный массив, состоящий
из зна-
чений ассоциативного массива. Она имеет
следующий формат:
@value_list = values(%Array)
Функция values возвращает массив значений
ассоциативного
массива в виде регулярного списка. Следующий
фрагмент программы
иллюстрирует использование функции values:
# Используем значения из предыдущего примера
%ages = ('Bob', 25, 'Mary', 30, 'Zack', 15);
ФУНКЦИЯ EACH
Функция each осуществляет итерации элементов в
ассоциатив-
ном массиве. Она имеет следующий формат:
@key_values = each(%Array);
Всякий раз, когда скрипт вызывает функцию each, она
возвра-
щает список из двух компонент, которые содержат
пару ключ-значе-
ние. Когда функция достигает конца списка, она
возвращает пустой
список. При следующем вызове функции процесс
итерации начнется
сначала. Следующий фрагмент программы
иллюстрирует использование
функции each:
# Используем значения из предыдущего примера
%ages = ('Bob', 25, 'Mary', 30, 'Zack', 15);
while (($name, $age) = each %ages)
{
# Выведем ages
print "$key is $ages{$key}\n";
}
ФУНКЦИЯ DELETE
Функция delete удаляет элементы ассоциативного
массива. Она
имеет следующий формат:
Delete $Array{Key}
Следующая инструкция использует функцию delete для
того,
чтобы удалить элемент, отвечающий ключу Bob из
ассоциативного
массива $Employees:
Delete $Employees{'Bob'}
АРГУМЕНТЫ КОМАНДНОЙ СТРОКИ
Скриптам на языке Perl легко получить доступ к
аргументам
командной строки. Всякий раз, когда запускается
скрипт, Perl по-
мещает аргументы командной строки скрипта в
списочную переменную
@ARGV. Следующий фрагмент программы служит для
вывода аргументов
командной строки на дисплей:
while ($arg = shift @ARGV)
{
print "$arg\n";
}
ДОСТУП К ПЕРЕМЕННЫМ ОКРУЖЕНИЯ
Доступ к переменным окружения осуществляется в
скриптах на
языке Perl также очень просто. Всякий раз при
запуске скрипта
Perl помещает копии переменных окружения в
ассоциативный массив с
именем %ENV. В следующей инструкции массив %ENV
используется для
вывода текущего каталога:
print "$ENV{PATH}\n"; # Выведет текущий каталог
Кроме получения значений из массива %ENV, скрипты
также мо-
гут изменять элементы массива. Такие изменения
массива %ENV изме-
нят установку переменных окружения для всякого
процесса-потомка,
создаваемого скриптом. Например, следующая
инструкция использует
массив %ENV для изменения текущего пути:
$ENV{PATH} = 'c:\\myexec;'.$ENV{PATH};
Примечание: Изменения, которые скрипт делает в
массиве %ENV, не
повлияют на исходные переменные окружения. Иными
словами, после
окончания работы скрипта переменные окружения
системы не изменят-
ся.