Perl - pakiety i moduły
Co to są pakiety?
Plik packageinstrukcja przełącza bieżący kontekst nazewnictwa do określonej przestrzeni nazw (tabeli symboli). Zatem -
Pakiet to zbiór kodu, który znajduje się we własnej przestrzeni nazw.
Przestrzeń nazw to nazwana kolekcja unikatowych nazw zmiennych (nazywana również tablicą symboli).
Przestrzenie nazw zapobiegają kolizjom nazw zmiennych między pakietami.
Pakiety umożliwiają konstruowanie modułów, które, gdy są używane, nie blokują zmiennych i funkcji poza własną przestrzenią nazw modułów.
Pakiet obowiązuje do momentu wywołania innej instrukcji pakietu lub do końca bieżącego bloku lub pliku.
Możesz jawnie odwoływać się do zmiennych w pakiecie przy użyciu rozszerzenia :: kwalifikator pakietu.
Poniżej znajduje się przykład z pakietami main i Foo w pliku. Tutaj specjalna zmienna __PACKAGE__ została użyta do wydrukowania nazwy pakietu.
#!/usr/bin/perl
# This is main package
$i = 1;
print "Package name : " , __PACKAGE__ , " $i\n";
package Foo;
# This is Foo package
$i = 10;
print "Package name : " , __PACKAGE__ , " $i\n";
package main;
# This is again main package
$i = 100;
print "Package name : " , __PACKAGE__ , " $i\n";
print "Package name : " , __PACKAGE__ , " $Foo::i\n";
1;
Wykonanie powyższego kodu daje następujący wynik -
Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10
Bloki BEGIN i END
Możesz zdefiniować dowolną liczbę bloków kodu nazwanych BEGIN i END, które działają odpowiednio jako konstruktory i destruktory.
BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
Każdy BEGIN blok jest wykonywany po załadowaniu i skompilowaniu skryptu perla, ale przed wykonaniem jakiejkolwiek innej instrukcji.
Każdy blok END jest wykonywany tuż przed zakończeniem pracy interpretera perla.
Bloki BEGIN i END są szczególnie przydatne podczas tworzenia modułów Perla.
Poniższy przykład pokazuje jego użycie -
#!/usr/bin/perl
package Foo;
print "Begin and Block Demo\n";
BEGIN {
print "This is BEGIN Block\n"
}
END {
print "This is END Block\n"
}
1;
Wykonanie powyższego kodu daje następujący wynik -
This is BEGIN Block
Begin and Block Demo
This is END Block
Co to są moduły Perla?
Moduł Perla to pakiet wielokrotnego użytku zdefiniowany w pliku biblioteki, którego nazwa jest taka sama jak nazwa pakietu z rozszerzeniem .pm.
Plik modułu Perla o nazwie Foo.pm może zawierać takie stwierdzenia.
#!/usr/bin/perl
package Foo;
sub bar {
print "Hello $_[0]\n"
}
sub blat {
print "World $_[0]\n"
}
1;
Kilka ważnych punktów na temat modułów Perla
Funkcje require i use załaduje moduł.
Oba używają listy ścieżek wyszukiwania w @INC aby znaleźć moduł.
Obie funkcje require i use Zadzwoń do eval funkcja do przetworzenia kodu.
Plik 1; na dole powoduje, że eval oceniany jest na PRAWDA (a zatem nie zawiedzie).
Funkcja Require
Moduł można załadować, wywołując metodę require działają w następujący sposób -
#!/usr/bin/perl
require Foo;
Foo::bar( "a" );
Foo::blat( "b" );
Musiałeś zauważyć, że nazwy podprogramów muszą być w pełni kwalifikowane, aby je wywołać. Byłoby miło włączyć podprogrambar i blat do zaimportowania do naszej własnej przestrzeni nazw, więc nie musielibyśmy używać kwalifikatora Foo ::.
Funkcja Use
Moduł można załadować, wywołując metodę use funkcjonować.
#!/usr/bin/perl
use Foo;
bar( "a" );
blat( "b" );
Zauważ, że nie musieliśmy w pełni kwalifikować nazw funkcji pakietu. Plikuse funkcja wyeksportuje listę symboli z modułu po dodaniu kilku instrukcji wewnątrz modułu.
require Exporter;
@ISA = qw(Exporter);
Następnie podaj listę symboli (skalary, listy, skróty, podprogramy itp.), Wypełniając zmienną listy o nazwie @EXPORT: Na przykład -
package Module;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);
sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" }
sub splat { print "Not $_[0]\n" } # Not exported!
1;
Utwórz drzewo modułów Perla
Kiedy jesteś gotowy do wysyłki swojego modułu Perla, istnieje standardowy sposób tworzenia drzewa modułów Perla. Odbywa się to za pomocąh2xsużyteczność. To narzędzie jest dostarczane wraz z Perlem. Oto składnia użycia h2xs -
$h2xs -AX -n ModuleName
Na przykład, jeśli Twój moduł jest dostępny w Person.pm plik, a następnie po prostu wydaj następujące polecenie -
$h2xs -AX -n Person
To da następujący wynik -
Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST
Oto opis tych opcji -
-A pomija kod Autoloadera (najlepiej używany przez moduły definiujące dużą liczbę rzadko używanych podprogramów).
-X pomija elementy XS (eXternal Subroutine, gdzie eXternal oznacza zewnętrzne w stosunku do Perla, tj. C).
-n określa nazwę modułu.
Więc powyższe polecenie tworzy następującą strukturę w katalogu Person. Rzeczywisty wynik pokazano powyżej.
- Changes
- Makefile.PL
- MANIFEST (zawiera listę wszystkich plików w pakiecie)
- README
- t / (pliki testowe)
- lib / (Tutaj znajduje się rzeczywisty kod źródłowy
Więc w końcu ty tartę strukturę katalogów do pliku Person.tar.gz i można go wysłać. Będziesz musiał zaktualizować plik README z odpowiednimi instrukcjami. Możesz także udostępnić kilka plików przykładów testowych w katalogu t.
Instalowanie modułu Perl
Pobierz moduł Perla w postaci pliku tar.gz. Użyj poniższej sekwencji, aby zainstalować dowolny moduł PerlaPerson.pm który został pobrany jako Person.tar.gz plik.
tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install
Interpreter Perla ma listę katalogów, w których szuka modułów (tablica globalna @INC).