2010-09-28 24 views
8

CGI :: Uygulamamdaki hangi modülün Moose yükleniyor olduğunu bulmaya çalışıyorum. "Gereksinimi" aşırı yüklemeyi denedim ama sözdizimi oldukça doğru görünmüyor. Birisi aşağıdaki kodu temizlemek olsaydı bunu takdir ediyorum:Hangi modüle Moose yüklediğini nasıl anlarım?

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

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

Temelde, bu komut dosyası ile sorun aslında hiçbir şey yüklenmiyor olmasıdır. CORE :: require (@) çağrıldığında bir şey "yapmaz". Komut adını doğrudan $ [0] kullanarak geçirmeyi denedim, ancak bu yalnızca zaman aşımına uğrayana kadar komut dosyasının kilitlenmesine neden oldu.

NOT: Yukarıdaki senaryo kimin "almak için modülün başlangıcında birkaç satır ekleyerek, belirli bir modül yüklenirken öğrenebilirsiniz benim baştan ayağa komut

cevap

16

Hows:!. @INC yılında altprogram referansları

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'; 
    }; 
} 

Bu "işler"

denir çünkü ve argümanlar olarak coderef ve dosya adını geçti görün require perldoc:

phaylon tarafından belirtildiği gibi, ayrıca sayesinde uygulama koştu (ve hangi dosya hangi çizgi onlara yüklenen) ise yüklenen tüm modüllerin bir özetini almak için Devel::TraceLoad kullanabilirsiniz * Nix ise

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

Mükemmel cevap! Bunu özellikle seviyorum çünkü Moose.pm dosyasını herhangi bir şekilde yamalamaktan kaçının. Bunun yerine, '@ INC' nin nadiren kullanılan, ama çok güzel bir özellikten faydalanırsınız. – daotoad

+1

Bunu bir içe aktarma yönteminin içine 'wholoads.pm' içine koyar ve yöntemin ilk argümanını kontrol ederseniz, 'perl -Mwholoads = Moose yourscript.pl' olarak kullanabilirsiniz. Ayrıca, stacktraces almak için Carp :: cluck() kullanmayı düşünürdüm, çünkü bu aynı zamanda çalışma zamanında tembel yükleme modüllerini de kapsayacaktı. – phaylon

+1

@phaylon: Harika bir fikir. Bütün bunları zaten CPAN'da yapan bir modül olsaydı şaşırmaz mıydım? Değilse yeni bir proje gibi geliyor! – draegtun

5

başındadır arayan". Kitaplık ağacı (perl -mMoose -wle'print $INC{"Moose.pm"}' yılında Moose.pm bulun ve düzenleyin.

package Moose; 

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

Bu hızlı ve kirli, ama buna tek ihtiyacınız var gibi geliyor (Moose değişiklikleri unedit unutmayın. bitirdiniz pm) hakkında

4

:

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

Kavram, Windows'ta da aynı olurdu.

Sen almalısınız:

Moose.pm did not return a true value at ... 
İlgili konular