2011-06-25 6 views
8
'_<perlmain.c' => *{'::_<perlmain.c'}, 
'_</usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/auto/Data/Dumper/Dumper.so' => *{'::_</usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/auto/Data/Dumper/Dumper.so'}, 
'_<universal.c' => *{'::_<universal.c'}, 
'_<xsutils.c' => *{'::_<xsutils.c'}, 
... 

वे %main:: की प्रतीक तालिका में क्यों हैं, जब वे उपयोगी होते हैं?% मुख्य :: की प्रतीक तालिका में कई सी फाइलें क्यों हैं?

+0

उन फ़ाइलों को पर्ल प्रतीकों को परिभाषित दिखाई देते हैं। (उदा। 'universal.c' बनाता है '& utf8 :: नवीनीकरण')। – ikegami

उत्तर

1

perl एक दुभाषिया आधारित भाषा है, इसकी जरूरत है, सही, उसका दुभाषिया, पर्ल बाइनरी। यह बाइनरी सिर्फ पर्ल स्क्रिप्ट पढ़ता है, और इसे कोड कोड में अनुवाद करके कोड निष्पादित करता है।

आपका perl दुभाषिया डीबग प्रतीकों के साथ संकलित है, इसलिए इसमें स्रोत फ़ाइलों के बारे में जानकारी शामिल है। इसके अलावा आप अपने उदाहरण में लोड मॉड्यूल Data::Dumper की ऑब्जेक्ट्स देखते हैं।

आशा है कि

+0

बिल्कुल नहीं, पर्ल दुभाषिया में सैकड़ों स्रोत फ़ाइलें हैं, केवल उपरोक्त कई सूचीबद्ध क्यों हैं? –

+0

क्योंकि, केवल दिखाए गए स्रोतों को निष्पादित कोड के साथ कुछ करना है। अधिक फ़ंक्शंस और मॉड्यूल का उपयोग करने का प्रयास करें, और आप अधिक संदर्भ देखेंगे। –

2

में मदद करता है सवाल से उत्पादन दोहराने के लिए,

#! /usr/bin/env perl 
use Data::Dumper; 
print Dumper \%main::; 

प्रविष्टियों आप देख gv_fetchfile_flags में डाला जाता है चलाएँ:

/* This is where the debuggers %{"::_<$filename"} hash is created */ 
tmpbuf[0] = '_'; 
tmpbuf[1] = '<'; 
memcpy(tmpbuf + 2, name, namelen); 
gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE); 
if (!isGV(gv)) { 
    gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE); 
#ifdef PERL_DONT_CREATE_GVSV 
    GvSV(gv) = newSVpvn(name, namelen); 
#else 
    sv_setpvn(GvSV(gv), name, namelen); 
#endif 
} 

इस तरह से कई बार कहा जाता है boot process in S_parse_body के हिस्से के रूप में।

boot_core_PerlIO(); 
boot_core_UNIVERSAL(); 
boot_core_mro(); 

ध्यान दें कि आप भी perlio.c, universal.c, और उत्पादन में mro.c के लिए प्रविष्टियों को देखें।

perldebguts documentation की Debugger Internals अनुभाग उनके उपयोग बताते हैं:

उदाहरण के लिए, जब भी आप फोन पर्ल के अंतर्निहित फोन करने वाले समारोह पैकेज DB से, तर्क है कि इसी ढेर फ्रेम के साथ करने के लिए कॉपी कर रहे हैं बुलाया गया था @DB::args सरणी। ये तंत्र -d स्विच के साथ पर्ल को कॉल करके सक्षम हैं। विशेष रूप से, निम्नलिखित अतिरिक्त सुविधाओं (perlvar में सीएफ $^P) सक्षम हैं:

  • ...
  • प्रत्येक सरणी @{"_<$filename"} पर्ल द्वारा संकलित एक फ़ाइल के लिए $filename की तर्ज रखती है। यह भी स्पष्ट स्ट्रिंग्स के लिए सच है जिसमें subroutines शामिल हैं, या जिन्हें वर्तमान में निष्पादित किया जा रहा है। $filename evaled तारों के लिए (eval 34) जैसा दिखता है। रेगेक्स में कोड सम्मिलन (re_eval 19) जैसा दिखता है।
  • प्रत्येक हैश %{"_<$filename"} में लाइन नंबर के आधार पर ब्रेकपॉइंट और क्रियाएं शामिल हैं। व्यक्तिगत प्रविष्टियां (पूरे हैश के विपरीत) सेटटेबल हैं। पर्ल केवल बूलियन के बारे में परवाह करता है, हालांकि perl5db.pl द्वारा उपयोग किए गए मानों में "$break_condition\0$action" है।
    मूल्यांकन स्ट्रिंग्स के लिए समान है जिसमें subroutines शामिल हैं, या जिन्हें वर्तमान में निष्पादित किया जा रहा है। Evaled तारों के लिए $ filename लगता है (eval 34) या (re_eval 19)।
  • प्रत्येक स्केलर ${"_<$filename"} में "_<$filename" शामिल हैं। यह मूल्यांकन स्ट्रिंग्स का भी मामला है जिसमें subroutines शामिल हैं, या जिन्हें वर्तमान में निष्पादित किया जा रहा है। $filename evaled तारों के लिए (eval 34) या (re_eval 19) जैसा दिखता है।
  • प्रत्येक आवश्यक फ़ाइल संकलित होने के बाद, लेकिन इसे निष्पादित करने से पहले, DB::postponed(*{"_<$filename"}) कहा जाता है अगर subroutine DB::postponed मौजूद है। यहां, $filename आवश्यक फ़ाइल का विस्तारित नाम है, जैसा कि %INC के मानों में पाया गया है।
  • ...
+0

बहुत पूरा उत्तर, लेकिन यह न भूलें कि प्रतीकों को हमेशा लोड किया जाता है, आप इसे केवल डीबग मोड में देखते हैं। और पूर्णता के लिए यहां वर्णित अधिक प्रतीकों हैं। –

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