2013-01-08 6 views
5

शुद्ध रूप से अकादमिक प्रश्न, और मुझे यहां पर प्रतिबंध लगाने वाले निर्देश नहीं दिख रहे हैं (हालांकि कोई 'अकादमिक' जैसा टैग नहीं है, मुझे मिल सकता है)।फ़ंक्शन हैश से फिस हैश स्लाइस फ़ंक्शन

अगर मैं निम्नलिखित की तरह एक मौजूदा हैश है, मैं एक टुकड़ा इसके बारे में दिखाया गया है ले जा सकते हैं (?):

my %hash = (one=>1, two=>2, three=>3, four=>4); 
my ($two, $four) = @hash{'two','four'}; 

वहाँ यह करने के लिए एक तरह से अगर हैश एक उदाहरण समारोह से वापस आ रहा है है इस तरह?

sub get_number_text 
{ 
    my %hash = (one=>1, two=>2, three=>3, four=>4); 
    return %hash; 
} 

एक तरीका यह है कि काम करता है:

my ($two, $four) = @{ { get_number_text() } }{'two', 'four'}; 

मैं यह समझ के रूप में, समारोह हैश कुंजियों/मूल्यों की एक सूची देता है, भीतरी {} एक गुमनाम हैश/रेफरी बनाता है, और @ {} एक सूची में "कास्ट" के संदर्भ का उपयोग करता है उर्फ ​​एक हैश टुकड़ा क्योंकि पर्ल जानता है कि रेफ एक हैश है। (मैं थोड़ा आश्चर्यचकित था कि आखिरी बिट काम करता था, लेकिन पर्ल के लिए अधिक शक्ति, आदि)

लेकिन क्या यह एक अभिव्यक्ति में स्वीकार्य रूप से अजीब पहुंच लिखने का सबसे स्पष्ट तरीका है?

+2

यह है क्योंकि यह रेफरी यह एक हैश है जानता नहीं है, यह एक वाक्य रचनात्मक बात है। '@ {foo} {bar} 'हमेशा एक हैश टुकड़ा होता है और हमेशा foo को कोड होने की अपेक्षा करता है जो हैश संदर्भ उत्पन्न करता है। – ysth

+0

@ysth यहां एक उत्तर पोस्ट करें और प्रश्न बंद हो जाएगा :) – gaussblurinc

+0

कोई कास्टिंग नहीं है। '@ {EXPR} {EXRP}' * * हैश स्लाइस है। शायद आप अव्यवस्था का मतलब था? – ikegami

उत्तर

6

सामान्य रूप से, एक subroutine से एक flattened हैश (return %foo) लौटने से बचें; यह किसी अन्य हैश में कॉपी किए बिना काम करना मुश्किल बनाता है। हैश संदर्भ वापस करने के लिए बेहतर (return \%foo)।

लेकिन हाँ, यह सबसे स्पष्ट तरीका है। अक्सर हार्डकोडेड कुंजी की सूची qw का उपयोग कर दिया जाता है हालांकि:

my ($two, $four) = @{ { returnit() } }{ qw/two four/ };