2013-04-13 11 views
5

Nie jestem pewien, czy i jaka różnica to sprawia, jeżeli rozpoczęcie Perl zNależy użyć "użyj 5.12.0, użyj ostrzeżeń;" w module perla?

package MYPACKAGE; 
use 5.12.0; 
use warnings; 

# functions are here 

1; 

lub

use 5.12.0; 
use warnings; 
package MYPACKAGE; 

# functions are here 

1; 

czy te use ... nie są uważane wcale ponieważ use ... są dziedziczone od wywołującego skryptu perla.

Pytanie prawdopodobnie sprowadza się do: czy warto jest podać te use ... w module lub czy jest to wystarczające, jeśli mam je określone w moim skrypcie perla.

Odpowiedz

7

Moduły pragmatyczne mają leksykalny, a nie dynamiczny zakres.

Wersja pragma aktywuje niektóre funkcje w bieżącym zakresie, w zależności od wersji. Nie aktywuje tych funkcji na całym świecie. Jest to ważne ze względu na kompatybilność wsteczną.

To oznacza, że ​​mogą być aktywowane Pragma poza definicji modułu, ale w środku naszego zakresie:

# this is package main 
use 5.012; # activates `say` 
package Foo; 
say "Hi"; # works, because lexical scope 

ta różni się od normalnych importu, które są importowane do bieżącego pakietu (= zasięg!).

Pragma warnings aktywuje ostrzeżenia w bieżącym zakresie.

Jednak każdy plik powinien zawierać use strict, ponieważ zakres leksykalny nigdy nie rozciąga się na pliki. Pragma nie są przechodnie:

Foo.pm:

say "Hi"; 
1; 

main.pl:

use 5.012; 
require Foo; 

zawiedzie.


Gdzie dokładnie umieścić te pragma jest więc w dużej mierze bez znaczenia. Zalecam umieszczenie pragmy przed package, gdy w pliku znajduje się wiele przestrzeni nazw, np.

use 5.012; use warnings; 

package Foo; 
...; 
package Bar; 
...; 
1; 

ale najpierw wstawić package, jeśli jest jedyną w pliku.

package Foo; 
use 5.012; use warnings; 
...; 
1; 

Jedyną ważną rzeczą jest to, że robisz use je ;-)

+0

Możliwe jest moduł do korzystania [ 'strict'] (http://perldoc.perl.org/strict.html "perldoc strict") i ["ostrzeżenia"] (http://perldoc.perl.org/warnings.html "perldoc warnings") w twoim imieniu. 'przykład pakietu; używaj ścisłego; sub import {strict-> import} 'Przykład: [Modern :: Perl] (http://p3rl.org/Modern::Perl" perldoc Modern :: Perl ") –