2011-04-12 10 views
8

मानक googleable जवाब "मैं पर्ले में हैश के आकार को कैसे ढूंढूं?" "keys(%hash) का आकार ले" है:खाली पर्ल हैश की एक कुंजी क्यों है?

my %h = {}; 
print scalar (keys (%h)); 

यह प्रिंट '1'। मैं शून्य की उम्मीद कर रहा था। दूसरी ओर। इसी तरह,

my %h = {}; 
$h{"a"} = "b"; 
$h{"x"} = "y"; 
print scalar keys (%h); 
print "\nKey: $_" for (keys %h); 

प्रिंटों:

कुंजी: एक

कुंजी: एक्स

कुंजी: हैश (0x229e8)

Wher क्या यह अतिरिक्त मूल्य आया है?

+10

आप गंभीरता से 'warnings' pragma को सक्षम करने पर विचार करना चाहिए। यह इस गलती को पकड़ लेगा। – rafl

+1

** इन ** स्क्रिप्ट्स के शीर्ष पर इन पंक्तियों को रखें: सख्त उपयोग करें; चेतावनियों का उपयोग करें; – shawnhcorey

उत्तर

20

इससे पहले मुझे थोड़ा सा भी है।

my %h =(); 

नोट () बजाय {} का उपयोग।

स्पष्टीकरण: मूल्य {}संदर्भ हैश के बजाय हैश में है। पर्ल में, एक संदर्भ स्केलर मान का एक प्रकार है, और %h को असाइनमेंट में एकल स्केलर मान निर्दिष्ट करने के लिए विशेष प्रसंस्करण है। यह स्केलर को स्ट्रिंग करता है (आपको अपने मामले में स्ट्रिंग HASH(0x229e8) देता है), और undef मान के साथ उस कुंजी को संबद्ध करता है।

() का उपयोग करते समय, सूची में हैश से असाइनमेंट सूची में जोड़े से कुंजी/मूल्य जोड़े बनाता है, और () खाली है, हैश %h खाली हो जाता है।

+0

बिल्कुल। और दूसरे उदाहरण में,% h = {} एक प्रविष्टि बनाएगा जो '{} => UNDEF' को मानचित्रित करता है। –

+1

हालांकि यह स्थिति _explain_ नहीं है। –

+1

@Tomalak - यकीन है कि यह करता है। ऊपर की टिप्पणी पढ़ें। – Ingo

6
use Data::Dumper; 

my %h = {}; 
warn Dumper \%h; 

%h कुंजी और undef मूल्य के रूप में के रूप में एक हैश संदर्भ के साथ सौंप दिया जाता है।

आउटपुट:

$VAR1 = { 
      'HASH(0x8683830)' => undef 
     }; 

rafl के रूप में सुझाव दिया, warnings pragma इस पकड़ा गया होता। सही कोड के लिए Greg Hewgill के answer पर देखें।

7

{} एक अज्ञात हैश का संदर्भ है। तो my %h = {} मेरे %h = ({} => undef) के बराबर है।

पर्ल तार होने के लिए हैश कुंजी की आवश्यकता है, इसलिए जब आप एक कुंजी के रूप में एक संदर्भ का उपयोग, पर्ल संदर्भ की स्ट्रिंग प्रतिनिधित्व (HASH(0x229e8)) का उपयोग करता है।

24
$ perl -Mwarnings -e'my %h = {}' 
Reference found where even-sized list expected at -e line 1. 

strict और warnings बहुत अच्छे कारणों के लिए पर्ल के साथ शामिल हैं। उनका उपयोग करने का कोई कारण नहीं है।

और भी बेहतर, भी मिश्रण में diagnostics जोड़ें:

$ perl -Mwarnings -Mdiagnostics -e'my %h = {}' 
Reference found where even-sized list expected at -e line 1 (#1) 
    (W misc) You gave a single reference where Perl was expecting a list 
    with an even number of elements (for assignment to a hash). This usually 
    means that you used the anon hash constructor when you meant to use 
    parens. In any case, a hash requires key/value pairs. 

     %hash = { one => 1, two => 2, }; # WRONG 
     %hash = [ qw/ an anon array/]; # WRONG 
     %hash = (one => 1, two => 2,); # right 
     %hash = qw(one 1 two 2);  # also fine 
+0

मैं हमेशा सख्त उपयोग करता हूं, हालांकि मुझे नहीं पता था कि 'चेतावनियां' और 'डायग्नोस्टिक्स' अतिरिक्त थे। धन्यवाद! – spraff

+7

'निदान' केवल डीबगिंग के लिए है। जब प्रोग्राम उत्पादन में जाता है तो इसे हटा दें। पर्ल को प्रश्न का उत्तर देने के लिए –

+2

+1। – darch

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