2010-09-28 19 views
8

Próbuję dowiedzieć się, który moduł w moim CGI :: Aplikacja ładuje łosia. Próbowałem przeciążać "wymaganie", ale wydaje mi się, że nie mam odpowiedniej składni. Jeśli ktoś mógłby oczyścić następujący kod bym to docenić:Jak dowiedzieć się, który moduł ładuje Łosia?

use strict; 
use warnings; 
use Carp qw//; 

BEGIN { 
    *CORE::GLOBAL::require = sub (*) { 
    warn "Requiring $_[0] at: " . Carp::longmess(); 
    CORE::require (@_); 
    }; 
} 

Zasadniczo, problem z tym scenariuszem jest to, że nie jest faktycznie ładowania czegokolwiek. Kiedy CORE :: require (@) jest wywoływane, nie "nic" robi. Próbowałem po prostu przekazać mu nazwę skryptu bezpośrednio za pomocą $ [0], ale to spowodowało tylko zakleszczenie skryptu, dopóki nie upłynął limit czasu.

UWAGA: Powyższy skrypt jest na początku mojego rozruchu skryptu

Odpowiedz

16

Hows o:.

BEGIN { 
    unshift @INC, sub { 
    printf "Moose first called by pkg %s at line %d in %s\n", (caller)[0,2,1] 
     if $_[1] eq 'Moose.pm'; 
    }; 
} 

ten "dzieł", ponieważ referencje podprogramów w @INC są nazywane i zdali coderef i nazwę pliku jako argumenty Zobacz require perldoc:

Jak wspomniano przez phaylon, można również użyć Devel::TraceLoad uzyskać podsumowanie wszystkich modułów ładowanych podczas gdy aplikacja prowadził (a co linia co plik je załadowany) z

perl -MDevel::TraceLoad=summary my_progam.pl 
+2

Doskonała odpowiedź! Podoba mi się to szczególnie, ponieważ unikasz łatania Moose.pm w jakikolwiek sposób. Zamiast tego korzystasz z rzadko używanej, ale bardzo fajnej funkcji '@ INC'. – daotoad

+1

Jeśli umieścisz to wewnątrz metody importowania w "wholoads.pm" i sprawdzisz z pierwszym argumentem metody, możesz użyć go jako "perl -Mwholoads = Moose yourscript.pl". Rozważę też użycie Carp :: cluck(), aby uzyskać pliki stacktrack, ponieważ obejmie to również moduły ładujące lazy w środowisku wykonawczym. – phaylon

+1

@phaylon: Świetny pomysł. Chociaż nie zdziwiłbym się, gdyby istniał moduł, który już to wszystko zrobił na CPAN? Jeśli nie, to brzmi jak nowy projekt! – draegtun

5

można dowiedzieć się, kto jest ładowanie danego modułu, poprzez wstawienie kilku wierszy na początku modułu, aby uzyskać " gość". Znajdź Moose.pm w drzewie biblioteki (perl -mMoose -wle'print $INC{"Moose.pm"}' i edytować je.

package Moose; 

use Data::Dumper; 
warn "!!! Moose is being loaded by: ", Dumper([caller]); 

Jest to szybki i brudny, ale to brzmi jak to wszystko, czego potrzebujesz (Nie zapomnij unedit zmian w Moose. pm, gdy skończysz)

4

W * nix:

mkdir dummy 
echo > dummy/Moose.pm 
perl -I./dummy /path/to/my_script.pl 

Koncepcja będzie taka sama w systemie Windows.

Powinieneś dostać:

Moose.pm did not return a true value at ... 
Powiązane problemy