2016-10-20 14 views
6

Przepraszamy za bardzo podstawowe pytanie, ale jestem początkujący poziom w Perl i nie mogłem znaleźć odpowiedniego wyjaśnienia na SO (lub nigdzie indziej!) Na to pytanie. Rozumiem, że mogę napisać kilka przykładów i spróbować to rozszyfrować, ale naprawdę mogę skorzystać z wiedzy ekspertów.Użycie qw (: const) z instrukcją użycia

Idę przez jakiegoś kodu, w którym deweloper pochodzących z użyciem bibliotek:

use libExample qw(:const) 

Teraz z tego co rozumiem, to znaczy pozyskiwanie stałych z libExample ale naprawdę chciałbym wiedzieć, jak to działa.

  1. Dlaczego nie mogę po prostu powiedzieć: use libExample qw(const) (Próbując zrozumieć zasadność :)

  2. Czy jest coś, co możemy/powinniśmy pisać w samych libExample.pm do innych deweloperów wykorzystaniem tej biblioteki wspominając takie opcje zamiast stałej.

Dzięki!

+0

Try to: http://perldoc.perl.org/Exporter.html – rubikonx9

+0

@ rubikonx9: Powinieneś wyjaśnić to bardziej szczegółowo i umieścić w odpowiedzi. –

Odpowiedz

6
use libExample qw(:const) 

odbierze wszystkie nazwy w $EXPORT_TAGS{const} anonimowej tablicy i importować je do bieżącej przestrzeni nazw.

Zważywszy

use libExample qw(const) 

wzrośnie const i zaimportować je w bieżącej przestrzeni nazw.

Istnieją także inne warianty:

[!]name   This name only 
[!]:DEFAULT  All names in @EXPORT 
[!]:tag   All names in $EXPORT_TAGS{tag} anonymous array 
[!]/pattern/ All names in @EXPORT and @EXPORT_OK which match 

Proszę przejść Exporter dokumentacji dla więcej szczegółów na ten temat.

+0

simbabque szczegółowo omówił przykład, który moim zdaniem powinien przeczytać każdy, ale akceptując to jako odpowiedź, ponieważ jest to bardziej precyzyjne i wyjaśnione do punktu, który natychmiast wyjaśnił wątpliwości, które miałem. –

8

Składnia use Foo qw(:const) używa funkcji EXPORT_TAGS w Exporter.

Po skonfigurowaniu modułu bibliotecznego zwykle masz kilka funkcji lub zmiennych klas. Następnie należy skonfigurować eksporter, informując go, co należy wyeksportować domyślnie:

package Foo; 
use Exporter; 

our @EXPORT = qw(frobnicate); 

sub frobnicate { ... } 

lub gdy zostaną o to poproszeni.

Ale można również powiedzieć, aby grupować rzeczy razem, więc użytkownik biblioteki nie musi wymieniać wszystkich metod. Rozważ ten przykład.

package Foo; 
use Exporter; 

our @EXPORT_OK qw(monday tuesday wednesday thursday friday saturday sunday); 

sub monday { ... } 
sub tuesday { ... } 
sub wednesday { ... } 
sub thursday { ... } 
sub friday { ... } 
sub saturday { ... } 
sub sunday { ... } 

Teraz gdybym chciał wszystkie dni robocze, musiałbym to zrobić:

use Foo qw(monday tuesday wednesday thursday friday); 

To jeden długi wiersz. Zamiast tego byłoby bardzo przydatne, gdyby można je pogrupować. Cóż, mogą być.Jeśli zrobisz to zamiast w bibliotece:

package Foo; 
use Exporter; 

our %EXPORT_TAGS = ( 
    working_days => [ 
     qw(monday tuesday wednesday thursday friday) 
    ], 
    weekend_days => [ 
     qw(saturday sunday) 
    ] 
); 

# ... 

Możemy następnie używać go z jednego tagu zamiast pięciu nazw funkcji:

use Foo qw(:working_days); 

pamiętać, że jest równoważne:

use Foo ':working_days';