2010-08-22 18 views
12

मैं पर्ल डिबगर अंदर 'आधुनिक पर्ल' कोड का मूल्यांकन करने में असमर्थ हूँ। फ़ाइल में कोड डीबग करते समय यह ठीक काम करता है, लेकिन प्रॉम्प्ट से नहीं।डीबगर के अंदर perl 5.10 सुविधाओं का उपयोग कैसे करें?

न्यूनतम उदाहरण:

# activating 5-10 features with -E (it works) 
$ perl -E 'say "x"' 
x 
 
# calling the debugger with -E 
# it works for infile code but for prompt line code... 
$ perl -dEbug Loading DB routines from perl5db.pl version 1.33 
    DB say "x" 
    String found where operator expected at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2, near "say "x"" 
    at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2 
     eval '([email protected], $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop;say "x"; 

[ध्यान दें: एक ही साथ " ': 5.10' उपयोग सुविधा" होता है]

मैं कुछ याद आ रही है?

उत्तर

7

यह है कि इतनी प्रशंसा एक दिलचस्प सवाल यह है, और एक मैं कभी नहीं सोचा।

मैं इस मुद्दे here के लिए एक संदर्भ मिला, लेकिन यह लगभग एक वर्ष पुराने हैं। हालांकि, perl स्रोत का प्रासंगिक भाग तब से नहीं बदला है, और here देखा जा सकता है। अनिवार्य रूप से, अगर आप पर्ल स्रोत में toke.c पर एक नज़र डालें, तो आपको निम्न देखें:

if (PL_perldb) { 
    /* Generate a string of Perl code to load the debugger. 
    * If PERL5DB is set, it will return the contents of that, 
    * otherwise a compile-time require of perl5db.pl. */ 

    const char * const pdb = PerlEnv_getenv("PERL5DB"); 
      ... 
} 
... 
if (PL_minus_E) 
    sv_catpvs(PL_linestr, 
      "use feature ':5." STRINGIFY(PERL_VERSION) "';"); 

असल में, डिबगर से पहले -E झंडा संसाधित किया जाता है भरी हुई है, इसलिए सुविधाएं अब भी जब सक्षम नहीं हैं डीबगर लोड हो जाता है। इस का सार है कि आप वर्तमान में -d कमांड के साथ -E उपयोग नहीं कर सकते है। आप say, switch, या डिबग शीघ्र से किसी भी अन्य सुविधा का उपयोग करना चाहते हैं, तो आप इस तरह यह करने के लिए है:

DB<1> use feature 'say'; say "x" 
    x 

निकटतम मैं एक समाधान के लिए देखा है है:

  1. के लिए या तो कहीं PERL5LIB में या वर्तमान निर्देशिका अपने PERL5LIB, एक अलग नाम के साथ से प्रति perl5db.pl, myperl5db.pl
  2. संपादित myperl5db.pl उपयोग की सुविधा के लिए कहते हैं ': 5.10'; (या बस 'राज्य', या बस 'कहना') पहली पंक्ति पर।
  3. वातावरण चर PERL5DB सेट "शुरू { 'myperl5db.pl' की आवश्यकता होती है}" को

कौन सा मैं PerlMonks में पाया।

+0

hummm, आपके उत्तर के लिए धन्यवाद, यह बताता है कि क्यों ऐसा होता है। लेकिन अब मैं और अधिक परेशान हूं: मैंने इन सुविधाओं को 'उपयोग सुविधा' के साथ डीबगर में लोड करने से पहले कोशिश की है '' और यह काम नहीं किया। अब मैंने चाल देखी: यह एक ही पंक्ति में होना चाहिए। क्यूं कर??? क्यों 'फीचर' मॉड्यूल मौजूदा दायरे (डीबी लाइन) के लिए स्थानीय कार्यों को निर्यात करता है ?? इसका उपयोग कैसे करें? हालांकि मैं हमेशा वैश्विक था। यदि आप कुछ स्थानीयकरण चाहते थे तो आप 'आवश्यकता' का उपयोग नहीं करते हैं? मैं इस मुद्दे पर किसी भी ज्ञान की सराहना करेंगे। –

+1

मैंने सोचा कि असामान्य भी था। ईमानदार होने के लिए, मुझे "क्यों" भाग पर वास्तव में यकीन नहीं है, लेकिन ऐसा लगता है कि आप बिल्कुल सही हैं - 'उपयोग सुविधा x' कथन कार्य करते हैं जैसे कि वे डीबी लाइन पर जा सकते हैं। मेरा अनुमान है कि प्रत्येक पंक्ति को एक अलग ब्लॉक/स्कोप के रूप में निष्पादित किया जाता है, क्योंकि 'my $ x = 1' जैसे चर को घोषित करने से बाद की रेखाओं पर 'x x' अनुपलब्ध हो जाएगा (क्योंकि यह अगले के दायरे में नहीं है रेखा, केवल वर्तमान लाइन)। यह सुसंगत रहेगा, क्योंकि प्रागमा (जैसे 'फीचर') को ब्लॉक के अंत में लेक्सिक रूप से स्कॉप्ड किया जाता है जिसमें आप उनका उपयोग करते हैं। – eldarerathis

+0

धन्यवाद, मुझे 'फीचर' लेक्सिकल स्कोप याद आया। यह 'केवल लाइन कार्रवाई में' बताता है। लेकिन क्या आपको पता है कि क्यों मेरा मॉड्यूल या स्क्रिप्ट 'उपयोग सुविधा' से शुरू होता है, तो यह काम नहीं करता है?क्या इसका मतलब यह है कि यह सभी 'उपयोग सुविधा ...' के साथ होगा। और आखिरकार, यदि आप पर्ल> 5.10 फीचर्स का उपयोग कर रहे हैं, तो स्क्रिप्ट में, लाइन में त्रुटि होने पर आप उन्हें कैसे डिबग करते हैं और आप डीबगर में इसके साथ खेलना चाहते हैं? क्या आप इसके साथ खेलने के लिए डेवेल :: आरईपीएल का उपयोग करेंगे? –

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