2012-04-13 17 views
7

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

#!/usr/local/bin/perl 
#Check hash and array references 
#Author: Sidartha Karna 
use warnings; 
use strict; 
use Data::Dumper; 

sub checkHashRef{ 
    my ($hashRef, $arrVal) = @_; 
    my %hashDeref = %{$hashRef}; 

    $hashDeref{'check'} = 2;   
    push(@{$arrVal}, 3); 

    print "There:" ; 
    print Dumper $hashRef;  
    print Dumper %hashDeref;   
    print Dumper $arrVal 

} 


my %hashVal = ('check', 1); 
my @arrVal = (1, 2); 

checkHashRef(\%hashVal, \@arrVal); 

print "here\n"; 
print Dumper %hashVal; 
print Dumper @arrVal; 

उत्पादन मनाया है:



    There:$VAR1 = { 
      'check' => 1 
     }; 
    $VAR1 = 'check'; 
    $VAR2 = 2; 
    $VAR1 = [ 
      1, 
      2, 
      3 
     ]; 
    here 
    $VAR1 = 'check'; 
    $VAR2 = 1; 
    $VAR1 = 1; 
    $VAR2 = 2; 
    $VAR3 = 3; 

उत्पादन से, मैं अनुमान लगाया है कि, hashDeref में परिवर्तन के संदर्भ में डेटा को संशोधित नहीं कर रहे हैं। क्या मेरी समझ सही है? क्या इसे वापस करने के बजाय हैश चर को संशोधित करने का कोई तरीका है।

उत्तर

18

यह %hashVal के एक (उथले) प्रतिलिपि बना रही है:

my %hashDeref = %{$hashRef}; 

हैश रेफरी $hashRef अभी भी %hashVal को इंगित करता है लेकिन %hashDeref नहीं है, यह सिर्फ एक प्रति है। आप यथा-स्थान से पारित कर दिया हैश रेफरी संशोधित करने के लिए चाहते हैं, तो पारित कर दिया हैश रेफरी के साथ काम:

sub checkHashRef{ 
    my ($hashRef, $arrVal) = @_; 
    $hashRef->{'check'} = 2; 
    #... 

कि %hashVal में अपने परिवर्तन छोड़ देंगे। सरणी मामले में, आप कभी नहीं एक प्रतिलिपि बनाने, तुम बस भिन्नता यह यथा-स्थान:

push(@{$arrVal}, 3); 

और $arrVal करने के लिए परिवर्तन @arrVal में दिखाई देता है।

+0

धन्यवाद "एमयू बहुत छोटा है" – Sid

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

  • कोई संबंधित समस्या नहीं^_^