Jestem początkującym w Perlu i staram się budować w mojej głowie najlepsze sposoby konstruowania programu Perla. Jestem biegły w Pythonie i jestem przyzwyczajony do Pythona from foo import bar
sposób importowania funkcji i klas zmoduły Pythona. Jak zrozumiałem w Perlu, istnieje wiele sposobów na to, modułów .pm i .pl, EXPORT i @ISA, używanie i wymaganie itp., A początkującemu nie jest łatwo zrozumieć, jakie są różnice zalety i wady każdego z nich (nawet po przeczytaniu Beginning Perl and Intermediate Perl).
Stwierdzony problem, moje obecne pytanie odnosi się do zdania z perldoc perlmod
:
Pliki modułu Perla mają rozszerzenie .pm. The
use
operator zakłada to, więc nie musisz przeliteruj „Module.pm” w cudzysłowie. To pomaga także odróżnić nowe moduły ze starych plików .pl i .ph.
Jakie są różnice między stary .pl sposób przygotowania modułów i Nowy .pm sposób?
Czy naprawdę są stary i nowoczesny sposób? (Zakładam, że są, ponieważ Perlmod tak mówi, ale chciałbym uzyskać trochę informacji na ten temat).
Odpowiedzi:
4 dla odpowiedzi № 1Jakie są różnice między starym sposobem przygotowywania modułów przez .pl a nowym sposobem .pm?
Możesz znaleźć kilka starych modułów wewnątrz standardowej biblioteki Perla (wskazanej przez @INC
, ścieżki można zobaczyć w perl -V
wydajność).
W dawnych czasach nie było paczek. Jeden robił np. require "open2.pl";
co jest analogiczne do zasadniczo obejmującegozawartość pliku w skrypcie wywołującym. Wszystkie funkcje zadeklarowane, wszystkie zmienne globalne stały się częścią kontekstu skryptu. Innymi słowy: zanieczyszczenie kontekstu. Włączenie kilku plików może spowodować wszystkie możliwe konflikty.
Wykorzystanie nowych modułów package
słowo kluczowe do zdefiniowania własnego kontekstu i nazwy przestrzeni nazw. Gdy use
Dzięki skryptowi nowe moduły mają możliwość nie importowania / dodawania czegokolwiek do bezpośredniego kontekstu skryptu, co zapobiega zanieczyszczeniu przestrzeni nazw i potencjalnym konfliktom.
@EXPORT
/@EXPORT_OK
listy są używane przez standardowy moduł narzędziowy Exporter
co pomaga zaimportować funkcje modułu dokontekst wywołujący: aby nie trzeba było cały czas zapisywać pełnej nazwy funkcji. Listy są zazwyczaj dostosowywane przez moduł w zależności od listy parametrów przekazanych do use
jak w use POSIX qw/:errno_h/;
. Widzieć perldoc Exporter
po więcej szczegółów.
@ISA
jest mechanizmem dziedziczenia Perla. Mówi Perlowi, że jeśli nie może znaleźć funkcji wewnątrz bieżącego pakietu, skanuje w poszukiwaniu funkcji wewnątrz wszystkich pakietów wymienionych w @ISA
. Proste moduły często mają tam tylko Exporter
wspomniane, aby użyć jego import()
metoda (co również jest dobrze opisane w tym samym perldoc Exporter
).
8 dla odpowiedzi № 2
The use
funkcja i .pm
moduły typu zostały wprowadzone w Perlu 5, wydanym16 lat temu w przyszłym miesiącu. Perlmod, o którym mówi „stare pliki .pl i .ph”, był używany z Perlem 4 (i wcześniejszym). W tym momencie są one interesujące tylko dla historyków komputerowych. Po prostu zapomnij o nich .pl
biblioteki.
3 dla odpowiedzi nr 3
Ponowne użycie kodu przez utworzenie plików .pl („pl” oznacza „bibliotekę Perla”) było sposobem, w jaki zostało to zrobione w Perlu 4 - zanim mieliśmy słowo kluczowe „package” i instrukcję „use”.
To paskudny stary sposób robienia rzeczy. Jeśli natrafisz na dokumentację, która go poleca, to jest to silna wskazówka, że powinieneś zignorować tę dokumentację, ponieważ jest ona albo bardzo stara, albo napisana przez kogoś, kto nie był na bieżąco z rozwojem Perla przez ponad piętnaście lat.
Po kilka przykładów różnych sposobów budowania modułów Perla w nowoczesny sposób, zobacz moja odpowiedź na wywołania metody modułu Perla: Czy można wywołać metodę „X” na niezdefiniowanej wartości w linii $ {SOMEFILE} $ {SOMELINE}
1 dla odpowiedzi nr 4
Nie wiem nic o .pl, a nie o modułach, które istniały jakiś czas temu, nikt nie wydaje się ich używać w dzisiejszych czasach, więc nie powinieneś ich używać.
Trzymaj się modułów pm, zignoruj teraz @ISA, to „dla OOP. Eksport też nie jest tak ważny, ponieważ zawsze możesz nazwać swoje metody całkowicie quallified.
Zamiast pisać to:
plik: MyPkg.pm
package MyPkg;
@EXPORT = qw(func1 func2);
sub func1 { ... };
sub func2 { ... };
plik: main.pl
#!/usr/bin/perl
use strict;
use warnings;
use MyPkg;
&func1();
na początek powinieneś napisać, że:
plik: MyPkg.pm
package MyPkg;
sub func1 { ... };
sub func2 { ... };
plik: main.pl
#!/usr/bin/perl
use strict;
use warnings;
use MyPkg;
&MyPkg::func1();
A później, gdy zobaczysz, które metody powinny być naprawdę eksportowane, możesz to zrobić bez konieczności zmiany istniejącego kodu.
Użycie ładuje twój moduł i importuje połączenia, którespowodowałoby, że wszystkie subskrybowane EXPORTED byłyby dostępne w twoim bieżącym pakiecie. W przykładzie z sekundami, które zrobiłby require, który nie wywołuje importu, ale zawsze używam „use”.