2017-02-15 2 views
4

In Perl 5.24.1 Was ist der Unterschied zwischen use lib und lib->import? Ich sehe beide verwendet, um ein Verzeichnis zu @INC hinzuzufügen. Ich verwende Stock Perl ohne Add-Ons. Ich habe gelesen http://perldoc.perl.org/lib.html und ich verstehe nicht viel über alle Wege, wie es verwendet wird. HierWorin besteht in Perl der Unterschied zwischen `usage lib` und` lib-> import`?

ein Beispiel:

Im folgenden Beispielcode die die erste use lib immer arbeitet, während der zweite lib->import in meinem Code nicht ich es in anderen Code auf der gleichen Maschine arbeiten zu sehen.

#!/usr/bin/perl -T 

use warnings; 
use diagnostics; 
use strict; 
# new perl 2.24.1 requires FindBin 
use FindBin; 
print "found: $FindBin::Bin\n"; 
#This always works: 
#use lib $FindBin::Bin; 
#why does this not always work? 
#lib->import($FindBin::Bin); 

foreach my $var(@INC){ 
    print "$var \n"; 
} 

Antwort

3

use lib EXPR lädt lib.pm und ruft zur Kompilierungszeit lib->import(EXPR) auf.

Nur tun lib->import(EXPR) wird das gleiche tun, außer wenn lib.pm nicht geladen wurde, wird es nichts tun. (Methodenaufrufe zu import() oder unimport() werden einfach ignoriert, wenn es keine solche Untergruppe gibt.) Aber es wird zur Laufzeit ausgeführt, es sei denn, Sie haben es in einem BEGIN-Block, was die Änderung zu @INC nicht bedeutet rechtzeitig durchgeführt, um eine spätere use zu beeinflussen.

+0

Vielen Dank! – turtle

3
use lib $FindBin::Bin; 

tun dies (ungefähr):

BEGIN { require "lib.pm"; lib->import($FindBin::Bin); } 

, die beide Lasten/kompiliert lib.pm und Anrufe importieren bei der Kompilierung (also der BEGIN-Block).

Wenn Sie lib->import(...) selbst aufrufen, funktioniert das, aber nur wenn lib bereits geladen ist und was auch immer Sie "importieren" macht Sinn zur Laufzeit vs Kompilierzeit. Mit dem Import von lib funktioniert das gut, betrifft aber nur zukünftige require (oder eval "use ...") Aufrufe. Für andere Pakete, wenn Sie Dinge wie Funktionen importieren möchten, kann dies unsinnig sein, besonders wenn diese Funktionen einen Prototyp haben, der sich auf die Kompilierzeitauflösung auswirkt.

+0

Vielen Dank das war sehr hilfreich. – turtle

Verwandte Themen