/ / Разделяне на Perl модул в множество файлове - perl, модул, perl-модул

Разделяне на Perl модул в множество файлове - perl, модул, perl-модул

Аз съм Perl начинаещ, който работи на модул, който е доста дълъг и аз искам да го разделите на няколко файла за по-лесна поддръжка и организация.Той сега изглежда така

#ABC.pm
package ABC;

use strict;
use warnings;

my $var1;
my $var2;

sub func1 {
#some operations on a $var
}

sub func2 {
#some operations on a $var
}

return 1;

Бих искал да изглежда нещо подобно

#ABC_Part_1.pm
package ABC;

use strict;
use warnings;

my $var1;
my $var2;

sub func1 {
#some operations on a $var
}

return 1;

#ABC_Part_2.pm
package ABC;

use strict;
use warnings;

sub func2 {
#some operations on a $var
}

return 1;

Въпросът, който имам, е да получа променливитеда се виждат в отделните файлове. Опитах се да ги декларирам с "нашата", но тогава трябва да използвам оператора за резолюция на обхвата, който не искам да правя. Бих искал да ги разглеждам като локални променливи в модулните файлове, но да ги скрия извикващ скрипт. Аз също бих искал само да включа един в скрипта, като

#!/usr/bin/env perl
#script.pl

use strict;
use warnings;
use ABC;

func1();
func2();

Благодаря

Отговори:

4 за отговор № 1

Въпросът, който имам, е да се видят променливите в отделните файлове.

Вашият най-добър вариант е да спрете да искате това.

Цялата точка на лексикалните променливи е за тяхда бъде достъпен само в малък локално видим битов код. Променливата, която трябва да бъде достъпна от няколко различни файла, е знак за "миризма на код".

Ако сте наистина сигурни, че искате това все пак ...

Опитах се да ги декларирам с "нашите", но тогава трябва да използвам оператора за разрешаване на обхвата, който не искам да правя.

Да, това трябва да работи, но трябва да декларирате променливата в горната част на всеки файл използваш го.

# ABC_part_1.pm
package ABC;
our $foo;

# code that accesses $foo goes here

1;

И тогава:

# ABC_part_2.pm
package ABC;
our $foo;

# code that accesses $foo goes here

1;

3 за отговор № 2

Можете да направите своя ABC.pm файл с колекция от require изявления.

package ABC;

require ABC1;
require ABC2;
require ABC3;

1;

Важно е да се работи с него require вместо use, защото use ще се опита да импортира неща автоматично. Но това няма да работи, тъй като няма package ABC1 във вашия ABC1.pm файл, така че ABC1->import ще се провали.

Що се отнася до променливите, наистина няма начин да получите лексикални променливи в различни файлове бих могъл употреба do вместо require, който ще чете и изпълнява файловете директно в реда с do, По този начин обхватът ще остане същият и вие може да имате това.

package ABC;

my $foo;
my $bar;

do "lib/ABC1.pm";
do "lib/ABC2.pm";

Моля, не правете това. Това е лудост!

Ако смятате, че вашата библиотека е твърде голяма,първо добавете подходяща документация към всяка функция и подредете така, че нещата, които принадлежат заедно, да са заедно. Ако това не ви помогне, разделете файла на по-малки логически единици и направете тези отделни пакети, които говорят помежду си чрез определен интерфейс, но също така могат да стоят сами, когато е необходимо.

Ако се повтаря един куп use изявленията се чувстват като твърде много котлова плоча, напишете собствената си колекция от модули (като стриктури) Внос :: Into.

Освен това не използвайте лексикалните променливи вобхват на файла. Ако искате да имате състояние за неща, създайте обектно ориентирани кодове и класове за писане. След това ще имате състояние и поведение. Ако имате данни за пакети / класове, използвайте променливи на пакетите.

Пърл няма понятие за частни неща по някаква причина. Има конвенции, които да означават нещата като частни, като да ги наименуваме _stuff с водещо подчертаване. Това е знак за всеки, че това е вътрешен, а не стабилен API, може да се промени във всеки един момент и не трябва да се бърка. Направете това, вместо да се опитвате да скриете нещата. Това е сила на Перл, за да ви позволи да се забъркате с всичко. Но това не означава теб трябва да го направя, Това е опция, която трябва да приемете.