2010-03-29 29 views
9

Wie der Titel sagt, bin ich nicht klar, wann solch eine Subroutine aufgerufen wird. Von der require Seite bei perldoc kann man schreiben:Wann wird eine Unterroutine in @INC aufgerufen?

push @INC, \&my_sub; 
sub my_sub { 
    my ($coderef, $filename) = @_; # $coderef is \&my_sub 
    ... 
} 

aber wo dies genau geht? Das erforderliche Paket oder das erforderliche Skript (oder Paket)? Ich habe beide mit einigen Sentinel print Aussagen versucht, aber keiner arbeitete so klar, dass es etwas gibt, das ich nicht bekomme.

Antwort

12

Perl ruft eine Unterprogrammreferenz in @INC auf, wenn es @INC durchläuft, um nach einem Modul zu suchen. Das heißt, Sie lösen es aus, wenn Sie versuchen, ein Modul mit use oder require zu laden, und Perl findet dieses Modul nicht in den vorhergehenden @INC Speicherorten.

BEGIN { 
    push @INC, 
     sub { print "Oops: There was an error looking for $_[1]\n"; }; 
    } 

eval "use Cat::Burglar"; 
eval "use Local::NotThere"; 
require Cat::Burglar; 

Sie müssen sicherstellen, dass Ihre Subroutinenreferenz in @INC ist, bevor Sie versuchen, die Module zu laden. Denken Sie daran, dass use eine Kompilierzeitfunktion ist und dass require eine Laufzeitfunktion ist. Wie beim Hinzufügen anderer "regulärer" @INC Einträge möchten Sie es wahrscheinlich in einem BEGIN Block so früh wie möglich in Ihrem Programm tun.

+1

Wow, irgendwie habe ich die 'require()' docs oft gelesen, ohne diese Funktion zu bemerken! – Ether

+1

Ich kenne die Dokumente nicht auswendig. Ich kann nur googeln. –

1

Um zu vermeiden, dass unser Unterprogramm mit den Subroutinen in den Standard-Perl-Modulen verwechselt wird, ist es ratsam, unshift anstelle von push zu verwenden. So wird es zuerst Ihre Subroutine von @INC verwenden.

+0

Ich denke, dass sollte etwas wie "Zu * bevorzugen * unsere Unterroutine mit den Lademodulen die Standard-Perl-Module" – justintime

+0

Yeah! Du bist richtig justintime. Sorry for my English – thillaiselvan

+1

Welche Array-Operation Sie verwenden, hängt davon ab, was Sie tun und wann Sie die Codereferenz auslösen möchten. Unshift bringt es an die Vorderseite des Arrays, drückt am Ende und Spleiß bringt es in jede Position, die du magst. Es ist jedoch abhängig von der Aufgabe. –

Verwandte Themen