雜湊引用

雜湊引用是標量,它包含指向包含雜湊資料的記憶體位置的指標。因為標量直接指向雜湊本身,所以當它傳遞給子例程時,對雜湊所做的更改不像常規雜湊那樣是子例程的本地,而是全域性的。

首先,讓我們檢查一下將普通雜湊傳遞給子例程並在其中修改時會發生什麼:

use strict;
use warnings;
use Data::Dumper;

sub modify
{
    my %hash = @_;

    $hash{new_value} = 2;

    print Dumper("Within the subroutine");
    print Dumper(\%hash);

    return;
}

my %example_hash = (
    old_value   => 1,
);

modify(%example_hash);

print Dumper("After exiting the subroutine");
print Dumper(\%example_hash);

結果如下:

$VAR1 = 'Within the subroutine';
$VAR1 = {
          'new_value' => 2,
          'old_value' => 1
        };
$VAR1 = 'After exiting the subroutine';
$VAR1 = {
          'old_value' => 1
        };

請注意,在我們退出子例程之後,雜湊保持不變; 對它的所有更改都是修改子例程的本地更改,因為我們傳遞了雜湊的副本,而不是雜湊本身。

相比之下,當你傳遞 hashref 時,你將地址傳遞給原始雜湊,因此子例程中所做的任何更改都將對原始雜湊進行更改:

use strict;
use warnings;
use Data::Dumper;

sub modify
{
    my $hashref = shift;

    # De-reference the hash to add a new value
    $hashref->{new_value} = 2;

    print Dumper("Within the subroutine");
    print Dumper($hashref);

    return;
}

# Create a hashref
my $example_ref = {
    old_value   => 1,
};

# Pass a hashref to a subroutine
modify($example_ref);

print Dumper("After exiting the subroutine");
print Dumper($example_ref);

這將導致:

$VAR1 = 'Within the subroutine';
$VAR1 = {
          'new_value' => 2,
          'old_value' => 1
        };
$VAR1 = 'After exiting the subroutine';
$VAR1 = {
          'new_value' => 2,
          'old_value' => 1
        };