/ / Podział modułu perla na wiele plików - perl, moduł, perl-moduł

Podział modułu perla na wiele plików - perl, moduł, perl-moduł

Jestem początkującym użytkownikiem perla, który pracuje nad modułem, który jest dość długi i chcę podzielić go na wiele plików w celu łatwiejszej obsługi i organizacji. Teraz wygląda to tak

#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;

Chciałbym, żeby wyglądało jakoś

#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;

Problem, który mam, polega na pobieraniu zmiennychbyć widoczne w oddzielnych plikach. Próbowałem zadeklarować je za pomocą "naszego", ale potem muszę użyć operatora rozdzielczości zakresu, którego nie chcę robić. Chciałbym traktować je jako zmienne lokalne w plikach modułów, ale je ukrywać wywołując skrypt. Chciałbym też, aby jeden był zawarty w skrypcie wywołującym, na przykład

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

use strict;
use warnings;
use ABC;

func1();
func2();

Dzięki

Odpowiedzi:

4 dla odpowiedzi № 1

Problem, który mam, polega na tym, że zmienne są widoczne w osobnych plikach.

Najlepszym wyjściem jest przestać tego chcieć.

Cały punkt zmiennych leksykalnych jest dla nichbyć dostępne tylko w niewielkim, lokalnie widocznym fragmencie kodu. Zmienna, która musi być dostępna z wielu różnych plików, jest oznaką "zapachu kodu".

Jeśli jesteś naprawdę pewien, że tego chcesz ...

Próbowałem zadeklarować je za pomocą "naszego", ale potem muszę użyć operatora rozdzielczości zakresu, którego nie chcę robić.

Tak, to powinno działać, ale musisz zadeklarować zmienną u góry każdy plik używasz tego.

# ABC_part_1.pm
package ABC;
our $foo;

# code that accesses $foo goes here

1;

I wtedy:

# ABC_part_2.pm
package ABC;
our $foo;

# code that accesses $foo goes here

1;

3 dla odpowiedzi № 2

Możesz uczynić swój plik ABC.pm zbiorem require sprawozdania.

package ABC;

require ABC1;
require ABC2;
require ABC3;

1;

Ważne jest, aby z nim pracować require zamiast use, bo use spróbuje zaimportować rzeczy automatycznie. Ale to nie zadziała, ponieważ nie ma package ABC1 w twoim pliku ABC1.pm, więc ABC1->import zawiedzie.

Jeśli chodzi o zmienne, to naprawdę nie ma sposobu, aby uzyskać zmienne leksykalne w różnych plikach mógłby posługiwać się do zamiast require, który odczytałby i uruchamiał pliki bezpośrednio w linii z do. W ten sposób zakres pozostanie taki sam, a Ty możesz to mieć.

package ABC;

my $foo;
my $bar;

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

Proszę nie rób tego. To jest szalone!

Jeśli uważasz, że twoja biblioteka staje się zbyt duża,najpierw dodaj odpowiednią dokumentację do każdej funkcji i sortuj, aby rzeczy, które należą do siebie, były razem. Jeśli to ci nie pomoże, podziel plik na mniejsze jednostki logiczne i stwórz te indywidualne pakiety, które komunikują się ze sobą za pośrednictwem zdefiniowanego interfejsu, ale także są w stanie stać samodzielnie w razie potrzeby.

Jeśli powtórzysz kilka use stwierdzenia wydają się zbyt dużą płytą kotła, należy napisać własną kolekcję modułów (jak zwyczaje) za pomocą Importuj :: Into.

Ponadto nie używaj zmiennych leksykalnych wzakres pliku. Jeśli chcesz mieć stan dla rzeczy, utwórz kod zorientowany obiektowo i napisz klasy. Będziesz miał stan i zachowanie. Jeśli masz dane pakietu / klasy, użyj zmiennych pakietowych.

Perl nie ma pojęcia rzeczy prywatnych z jakiegoś powodu. Istnieją konwencje oznaczające rzeczy jako prywatne, jak nazywanie ich _stuff z wiodącym podkreśleniem. To jest znak dla wszystkich, że to jest wewnętrzny, a nie stabilny API, może się zmienić w każdej chwili i nie powinno być z tym związane. Zrób to, zamiast próbować ukryć rzeczy. To siła Perla, która pozwala ci wszystko zepsuć, ale to nie oznacza ciebie muszę to zrobić. To opcja, którą powinieneś przyjąć.