2010-09-28 11 views
8

मैं यह पता लगाने की कोशिश कर रहा हूं कि मेरे सीजीआई में कौन सा मॉड्यूल :: एप्लिकेशन मूस लोड कर रहा है। मैंने "आवश्यकता" अधिभारित करने का प्रयास किया लेकिन मुझे लगता है कि सिंटैक्स बिल्कुल सही नहीं है। यदि कोई व्यक्ति निम्न कोड को साफ कर सकता है मैं इसे सराहना करते हैं:मैं कैसे पता लगा सकता हूं कि मॉड्यूल मूस लोड कर रहा है?

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

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

असल में, इस स्क्रिप्ट के साथ समस्या यह है कि यह वास्तव में कुछ भी लोड नहीं किया जाता है। जब कोर :: की आवश्यकता होती है (@) कहा जाता है वह कुछ भी नहीं करता है। मैंने इसे सीधे $ [0] का उपयोग करके स्क्रिप्ट नाम को पारित करने का प्रयास किया, लेकिन इसके परिणामस्वरूप स्क्रिप्ट डेडलॉकिंग का समय समाप्त हो गया।

नोट: ऊपर स्क्रिप्ट आप पता लगा सकते हैं, जो एक विशेष मॉड्यूल लोड कर रहा है मॉड्यूल के शुरू में कुछ लाइनें डालने प्राप्त करने के लिए "के आधार पर अपने शुरू अप स्क्रिप्ट

उत्तर

16

Hows के बारे में:।

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

यह "काम" क्योंकि @INC में सबरूटीन संदर्भ कहा जाता है और coderef और तर्क के रूप में फ़ाइल नाम से पारित कर दिया देखें require perldoc:

0,123,

phaylon से उल्लेख किया है, आप भी Devel::TraceLoad उपयोग कर सकते हैं के साथ भरी हुई है, जबकि अपने आवेदन भाग गया (और क्या फ़ाइल किस लाइन उन्हें लोड) सभी मॉड्यूल का एक सारांश प्राप्त करने के लिए

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

बहुत बढ़िया जवाब! मुझे यह विशेष रूप से पसंद है क्योंकि आप किसी भी तरह से Moose.pm को पैच करने से बचते हैं। इसके बजाय आप '@ INC' की शायद ही कभी उपयोग की जाने वाली, लेकिन बहुत अच्छी सुविधा का लाभ उठाते हैं। – daotoad

+1

यदि आप इसे एक आयात विधि के अंदर 'wholoads.pm' में डालते हैं और विधि के पहले तर्क के खिलाफ जांच करते हैं तो आप इसे 'perl -Mwholoads = Moose yourscript.pl' के रूप में उपयोग कर सकते हैं। मैं स्टैपट्रैस पर जाने के लिए कार्प :: क्लक() का उपयोग करने पर भी विचार करता हूं, क्योंकि यह रनटाइम पर आलसी लोडिंग मॉड्यूल भी शामिल करेगा। – phaylon

+1

@ फीयलॉन: महान विचार। हालांकि अगर कोई ऐसा मॉड्यूल था जो सीपीएएन पर पहले से ही किया गया तो मुझे आश्चर्य नहीं होगा? यदि यह एक नई परियोजना की तरह नहीं लगता है! – draegtun

5

की शुरुआत में है फोन करने वाले "। अपने पुस्तकालय पेड़ (perl -mMoose -wle'print $INC{"Moose.pm"}' में Moose.pm ढूंढ़ें, और इसे संपादित:।

package Moose; 

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

यह त्वरित और गंदी है, लेकिन यह लग रहा है जैसे कि यह आप सभी की जरूरत है (मूस में परिवर्तन unedit के लिए मत भूलना। बजे जब आप समाप्त कर)

4

* सिफ़र में:

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

अवधारणा विंडोज़ में समान होगी।

आप मिलना चाहिए:

Moose.pm did not return a true value at ... 
संबंधित मुद्दे

 संबंधित मुद्दे