Perl Hash по ссылке - PullRequest
       34

Perl Hash по ссылке

3 голосов
/ 14 декабря 2011

, поэтому я пытаюсь написать подпрограмму, которая принимает хеш-параметр и добавляет к нему пару пар ключ-значение (по ссылке). До сих пор у меня есть это:

addParams(\%params);

sub addParams
{
    my(%params) = %{$_[0]}; #First argument (as a hash)

    $params{"test"} = "testing";
}

Но по какой-то причине, похоже, не добавляется ключ 'test'. Я новичок в Perl, но разве вы не передаете хеш по ссылке? Заранее спасибо.

1 Ответ

12 голосов
/ 14 декабря 2011

Вы можете использовать хэш-ссылку, не отменяя ссылки на нее:

addParams(\%params);

sub addParams
{
    my $params = shift;

    $params->{"test"} = "testing";
}

РЕДАКТИРОВАТЬ:

Для решения проблемы вашего кода, когда вы делаете:

my(%params) = %{$_[0]};

На самом деле вы делаете копию того, на что ссылается ссылка с% {...}.Вы можете увидеть это на примере в разобранном виде (без функции, с той же функциональностью):

my %hash = ( "foo" => "foo" );
my %copy = %{ \%hash };

$hash{"bar"} = "bar";
$copy{"baz"} = "baz";

print Dumper( \%hash );
print Dumper( \%copy );

Выполнить:

$ ./test.pl
$VAR1 = {
          'bar' => 'bar',
          'foo' => 'foo'
        };
$VAR1 = {
          'baz' => 'baz',
          'foo' => 'foo'
        };

Оба хеша имеют исходный 'foo => foo', нотеперь у каждого есть свой бар / баз.

...