2013-04-13 7 views
5

Ich bin nicht sicher, ob und was für einen Unterschied macht es, wenn ein eine Perl-Modul Sollte ich "verwenden 5.12.0 verwenden; Warnungen verwenden" in einem Perl-Modul?

use 5.12.0; 
use warnings; 
package MYPACKAGE; 

# functions are here 

1; 

mit

package MYPACKAGE; 
use 5.12.0; 
use warnings; 

# functions are here 

1; 

oder

starten oder wenn diese use ... nicht bei allen weil die use ... vererbt angesehen werden aus dem aufrufenden Perl-Skript.

Die Frage läuft wahrscheinlich auf: ist es wert, diese use ... in einem Modul anzugeben oder reicht es aus, wenn ich sie in meinem Perl-Skript angegeben habe.

Antwort

7

Pragmatische Module haben einen lexikalischen, nicht dynamischen Bereich.

Das Versionspragma aktiviert bestimmte Funktionen im aktuellen Bereich, abhängig von der Version. Es aktiviert diese Features nicht global. Dies ist wichtig für die Rückwärtskompatibilität.

Das bedeutet, dass ein Pragma außerhalb des Moduls Definition aktiviert werden, aber in unserem Bereich:

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

Dies unterscheidet sich von normalen Einfuhren, die in das aktuelle Paket importiert werden (= Umfang!).

Das Pragma aktiviert Warnungen im aktuellen Bereich.

Allerdings sollte jede Datei die use strict enthalten, da sich der lexikalische Bereich niemals über Dateien erstreckt. Pragmas sind nicht transitiv:

Foo.pm:

say "Hi"; 
1; 

main.pl:

use 5.012; 
require Foo; 

ausfällt.


Wo genau Sie diese Pragmas setzen ist damit weitgehend irrelevant. Ich würde empfehlen, die Pragmas vor die package zu setzen, wenn Sie mehrere Namespaces in der Datei haben, z.

use 5.012; use warnings; 

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

aber die package erste Stelle zu setzen, wenn es das einzige in der Datei ist.

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

Das einzig Wichtige ist, dass Sie tun use ihnen ;-)

+0

Es ist möglich, ein Modul zu verwenden, [ 'strict'] (http://perldoc.perl.org/strict.html "perldoc strict") und ["warnings"] (http://perldoc.perl.org/warnings.html "perldoc warnings") in Ihrem Namen. 'Paketbeispiel; Verwenden Sie streng; sub import {strict-> import} Beispiel: [Modern :: Perl] (http://p3rl.org/Modern::Perl "perldoc Modern :: Perl") –

Verwandte Themen