2016-01-27 7 views
8

यह एक सूक्ष्मता है जिसे मैंने keys() के साथ पाया।ऑटोविविफिकेशन कुंजी() और% {..} के साथ क्यों होता है?

$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my @e = keys(%{$d->{cd}});' 

$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my %e = %{$d->{cd}};' 
Can't use an undefined value as a HASH reference at -e line 1. 

मुझे सबसे परेशान है कि क्यों पहला स्निपेट एक डीरेंसिंग त्रुटि नहीं देगा। जब मैं Data::Dumper का उपयोग करता हूं, तो यह स्पष्ट हो जाता है कि पहले स्निपेट में, $d->{cd}, {} होने के लिए स्वत: एकीकृत है।

keys को स्वचालित करने की आवश्यकता क्यों है? मैंने इसके लिए perldoc पढ़ने की कोशिश की, एक संतोषजनक उत्तर नहीं मिला। keys उपनाम सेट नहीं करता है ($_, आदि) तो $d->{cd} को सोचने के लिए पर्ल की आवश्यकता नहीं है, क्या वहां है? (मैं समझता हूँ कि अगर अभिव्यक्ति lvalue संदर्भ autovivification में होना के रूप में समझाया होता here की जरूरत है।

एक प्रासंगिक post

+5

https://rt.perl.org/Public/Bug/Display.html?id=118983 – ThisSuitIsBlackNot

उत्तर

3

ध्यान दें कि कुंजी वास्तव में एक lvalue हो सकता है (तत्वों की हैश की अपेक्षित संख्या) की स्थापना।

लेकिन भले ही कुंजी अपने आप में एक lvalue संदर्भ में नहीं किया जाता है, यह एक हैश के इटरेटर रीसेट करने का एक पक्ष प्रभाव है।

तो यह हैश को संशोधित करता है और इसलिए भिन्नता एक lvalue संदर्भ है, जो यह autovivify बनाता देता है

0

कुछ शोध और पूछने के बाद, मैंने पाया कि इस तथ्य के साथ यह करना है कि $d->{cd} को एक सबराउटिन में पारित किया गया था, यह तथ्य नहीं कि यह keys था। उदाहरण के लिए,

% perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; sub foo {}; my @e = foo(%{$d->{cd}});' 

यह भी स्वत: प्रदान करेगा; ऐसा इसलिए है क्योंकि आंतरिक रूप से perl को तर्कों को कार्य करने के लिए उपनाम सेट करने में सक्षम होना चाहिए।

foo() के अंदर, हम एक उपनाम $_[0] = $d->{cd} निर्धारित किया है लेकिन वह $d->{cd}, lvalue-सक्षम होने की जरूरत के बाद से पर्ल में सबरूटीन्स आप $_[0] = "123"; की तरह कुछ तो autovivification होने की जरूरत है क्या कर सकते हैं यह मान का मतलब है।

+0

आप सबराउटिन तर्कों के बारे में सही हैं, लेकिन 'कुंजी' एक ऑपरेटर है, न कि सबराउटिन। 'कुंजी' के लिए तर्क को एक लाभा माना जाता है, लेकिन यह सभी ऑपरेटरों के लिए मामला नहीं है। 'Perl -E'keys% $ h की तुलना करें; $ h'' 'perl -E'length% $ h कहें; $ h'' कहो। – ThisSuitIsBlackNot

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