2010-05-25 2 views
7

पर्ल में हैश की मेरी वर्तमान समझ के आधार पर, मैं इस कोड को "हैलो वर्ल्ड" प्रिंट करने की उम्मीद करूंगा। यह बदले में कुछ भी प्रिंट नहीं करता है।मैं पर्ल में हैश का हैश कैसे बना सकता हूं?

%a=(); 

%b=(); 
$b{str} = "hello"; 
$a{1}=%b; 

$b=(); 
$b{str} = "world"; 
$a{2}=%b; 

print "$a{1}{str} $a{2}{str}"; 

मुझे लगता है कि हैश सिर्फ एक सरणी की तरह है, तो मैं एक हैश क्यों नहीं बना सकता?

+3

यह छोटा और प्यारा क्यों काम नहीं करता है, क्योंकि मूल रूप से, हैश या सरणी में केवल स्केलर मान हो सकते हैं, और हैश स्केलर नहीं होते हैं। हालांकि, हैश संदर्भ हैं। :) नीचे दिए गए उत्तरों के बारे में कुछ अच्छे लिंक हैं कि यह क्यों है। उपयोग के लिए –

उत्तर

6
  1. तुम हमेशा का उपयोग करना चाहिए "सख्त का उपयोग करें;" आपके कार्यक्रम में

  2. संदर्भ और अज्ञात हैंश का उपयोग करें।

use strict;use warnings; 
my %a; 

my %b; 
$b{str} = "hello"; 
$a{1}={%b}; 

%b=(); 
$b{str} = "world"; 
$a{2}={%b}; 

print "$a{1}{str} $a{2}{str}"; 

{%b} हैश %b की प्रतिलिपि करने के लिए संदर्भ बनाता है। आपको यहां कॉपी की आवश्यकता है क्योंकि आप इसे बाद में खाली कर देते हैं।

+0

+1 सख्त सलाह – Mike

+1

@ माइक: सख्त का उपयोग * मानक * होना चाहिए, विशेष मामला नहीं। – Ether

+0

@ether मुझे एहसास है कि अब, मैं पर्ल सीख रहा हूं और अभी पता चला है * सख्त * – Mike

6

हैश के हैंश पहली बार सही होने के लिए मुश्किल हैं। आप कहां जाना चाहते हैं इस मामले में

$a{1} = { %b }; 
... 
$a{2} = { %b }; 

आप मिल जाएगा।

पर्ल में द्वि-आयामी डेटा संरचनाओं के बारे में जानकारी के लिए perldoc perllol देखें।

+1

'perldoc perllol' सभी सरणी है, हर समय, मुझे लगता है। 'perldoc perldsc' अधिक जटिल परिदृश्यों में चला जाता है (और इसमें हैश शामिल हैं)। मैं पर्ल में संदर्भों के लिए नए किसी भी व्यक्ति के लिए 'perldoc perlreftut' की अत्यधिक अनुशंसा करता हूं। – Telemachus

1

पर्ल आपके डेटा संरचनाओं को फ़्लैट करना पसंद करता है। यह अक्सर एक अच्छी बात है ... उदाहरण के लिए, (@options, "another option", "yet another") एक सूची के रूप में समाप्त होता है।

यदि आप वास्तव में एक दूसरे के अंदर एक संरचना का मतलब है, तो आंतरिक संरचना को संदर्भ होना चाहिए। इसलिए जैसा:

%a{1} = { %b }; 

ब्रेसिज़ एक हैश है, जो आप% ख से मूल्यों के साथ भरने रहे हैं, और वापस एक संदर्भ के बजाय एक सीधे हैश के रूप में हो रही है इंगित करते हैं।

तुम भी कह सकते हैं

$a{1} = \%b; 

लेकिन उन बदलावों को एक {1} के रूप में अच्छी तरह से $% ख में परिवर्तन करता है।

2

माइक, एलेक्ज़ेंडर का सही जवाब है।

इसके अलावा एक टिप

। यदि आप केवल सीख रहे हैं हैंश पेर्ल में डेटा :: डम्पर नामक एक मॉड्यूल है जो आपके लिए आपके डेटा संरचनाओं को सुंदर-प्रिंट कर सकता है, जो वास्तव में आसान है जब आप यह देखना चाहते हैं कि आपके डेटा संरचनाओं के मूल्य क्या हैं।

use Data::Dumper; 
print Dumper(\%a); 

जब आप इस प्रिंट यह

$VAR1 = { 
      '1' => { 
        'str' => 'hello' 
       }, 
      '2' => { 
        'str' => 'world' 
       } 
     }; 
4

लघु जवाब पता चलता है: हैश कुंजी केवल एक अदिश, नहीं एक हैश के साथ जुड़ा हो सकता है। जो भी आप चाहते हैं उसे करने के लिए, आपको संदर्भों का उपयोग करने की आवश्यकता है।

बहु-स्तर डेटा संरचनाओं को बनाने के लिए पुनः-हैश (हे) की बजाय, मेरा सुझाव है कि आप perlreftut पढ़ें। perlref अधिक पूर्ण है, लेकिन यह पहली बार थोड़ा जबरदस्त है।

+1

perldsc (डेटा संरचना कुकबुक) शुरू करने के लिए एक अच्छी जगह है। –

+0

धन्यवाद! मैं perldsc के बारे में भूल गया। मुझे यह याद रखने के लिए perlref को देखना पड़ा था कि perlreftut अस्तित्व में था। :-) मुझे लगता है कि मुझे दस्तावेज़ों के साथ खुद को फिर से परिचित करना चाहिए। –

+0

@ डेविडवॉल डॉक्स की समीक्षा करना हमेशा अच्छा होता है, लेकिन विशेष रूप से ट्यूटोरियल अनुभाग भूलना आसान है लेकिन याद नहीं किया जाना चाहिए। मुझे विशेष रूप से 'perlre',' perlreftut', 'perldsc', 'perlopentut',' perltoot' पसंद है) (शायद यह एक पुराना है या पर्ल में ओओ के बारे में वर्तमान सर्वोत्तम प्रथाओं के संपर्क में है - निश्चित नहीं) और' perlstyle '। – Telemachus