/ / Stare moduły .pl w porównaniu z nowymi modułami .pm - perl, moduł perl

Stare moduły .pl a nowe moduły .pm - perl, moduł perl

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 № 1

Jakie 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 useDzię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 .pmmoduł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”.