Ссылка на основную переменную в пакете - PullRequest
2 голосов
/ 18 июня 2020

Я хочу создать библиотеку с методами A (), B () и C (), которые будут вызываться сотни раз в каждой программе perl с разными строками в качестве параметров. Каждый метод обновляет соответствующий массив (@A, @B и @ C), поэтому я не хочу каждый раз передавать массив по ссылке. Каждая программа perl также несколько уникальных строк, которые они добавляют в массив, поэтому я не могу создать массив и изменить его только пакетом.

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

main.pl

use MyPackage;
our @a;

MyPackage.pm

package MyPackage;
$alias_a = @main::a;
push @alias_a, "1";

ИЛИ

$aref = \@main::a;
push @$aref, "1";

edit: обновлен OP с дополнительной справочной информацией.

1 Ответ

1 голос
/ 18 июня 2020

Таким образом глобальные переменные объявляются и используются в Perl. В своем основном исполняемом файле вы можете использовать

@main::a 

напрямую или (предварительно) объявить его с помощью

our @a;

или

use vars q(@a);

и использовать его с @a в вашем основном скрипте.

Когда вы используете эту глобальную переменную в другом пакете, вы должны использовать полную форму @main::a. Специально для глобальных переменных, объявленных в пакетах (кроме основных), существует пакет Exporter, который позволяет вам импортировать их в ваше собственное пространство имен, поэтому вам не нужно использовать форму @package::variable.

См. https://perldoc.perl.org/Exporter.html, https://perldoc.perl.org/functions/our.html и https://perldoc.perl.org/vars.html для дальнейших пояснений.

...