Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РЭУБД_лекции.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
1.05 Mб
Скачать

Использование пакетов для изоляции подпрограмм

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

&sub_one;

&sub_two;

print "Переменная 1 $package_one'some_data\n"

print "Переменная 2 $package_two'some_data\n"

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

package some_package_name

$some_data = 1;

sub some_sub

{

return $some_data;

}

В данном случае переменная $some_data существует только в пакете и поэтому защищена от некорректного доступа. Использование пакета, таким образом, обеспечивает данным ту же область видимости, где глобальные переменные имеют своей областью видимости тот файл исходных кодов, в котором они объявлены. При вызове подпрограммы из другого файла скриптов необходимо использовать имя пакета:

require 'some_package.pl';

print &some_package_name'some_sub;

Если выражение включает строковые операнды, то Perl конвертирует строковые значения в числовые перед тем, как оценить выражение. В настоящее время Perl поддерживает следующие арифметические операторы: ? + сложение ? - вычитание или изменение знака ? * умножение ? / деление (только для чисел с плавающей запятой) ? % взятие по модулю (только для целочисленных значений)

Рассмотрим примеры следующих арифметических операций языка Perl:

$x = 2.5;

$y = 3;

print ($x + 2*$y); # выведет 8.5

print (7 / $y); # выведет 2.3333333

print int (7 / $y); # выведет 2

print (7 % $y); # выведет 1

print (7.5 % $y); # выведет 1

Perl также поддерживает операторы инкремента и декремента:? ++ декремент в префиксной или постфиксной форме? - инкремент в префиксной или постфиксной форме Рассмотрим примеры операций инкремента и декремента:

$x = 4;

++$x;

print $x; # выведет 5

$y = $x-; # уменьшит x после присвоения y значения x

print "$y $x" # выведет 5 4

Наконец, Perl обеспечивает арифметический оператор для возведения в степень (**). Рассмотрим следующие примеры использования операции возведения в степень:

$x = 2 ** 3; # результат 8

$x = 2 ** 0.5; # квадратный корень из 2

$x = -2 ** -3; # 1/(-2 в кубе), результат -1/8 (-0.125)