2012-04-13 36 views
7

Tôi gặp sự cố khi hiểu các tham chiếu băm và thay đổi giá trị băm tại chỗ thay vì trả về hàm băm. Tôi muốn viết một thói quen phụ mà sẽ trả về một giá trị từ băm và cũng sửa đổi băm. Tôi đã phải đối mặt với một số vấn đề trong khi mã hóa cho nó. Vì vậy, tôi đã viết mã cơ bản sau đây để hiểu sửa đổi băm tại chỗ.Perl sửa đổi tham chiếu băm trong chương trình con

#!/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; 

Kết quả quan sát được là:



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

Từ đầu ra, tôi suy ra rằng, những thay đổi để hashDeref không sửa đổi dữ liệu trong các tài liệu tham khảo. Tôi hiểu có đúng không? Có cách nào để sửa đổi biến băm tại chỗ thay vì trả lại nó không.

Trả lời

18

này được thực hiện một (cạn) bản sao của %hashVal:

my %hashDeref = %{$hashRef}; 

Các băm-ref $hashRef vẫn trỏ tới %hashVal nhưng %hashDeref không, nó chỉ là một bản sao. Nếu bạn muốn thay đổi thông qua băm-ref tại chỗ, sau đó làm việc với truyền băm-ref:

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

Đó sẽ để lại những thay đổi của bạn trong %hashVal. Trong trường hợp mảng, bạn không bao giờ tạo một bản sao, bạn chỉ dereference nó tại chỗ:

push(@{$arrVal}, 3); 

và sự thay đổi để $arrVal xuất hiện trong @arrVal.

+0

Cảm ơn bạn "mu quá ngắn" – Sid

Các vấn đề liên quan