2016-06-01 4 views
-5

Это мой код:Concatenate хэш-значение, когда хэш ссылки

my $hash = shift; // in this hash i have a key 'key' that has the value 'this is a' 


$hash{'key'} .= 'string'; //trying to concatenate the two strings 

use Data::Dumper; 

print Dumper $hash{'key'}; // prints "hash(0x36fc12..) string" 

Я пытаюсь получить:

key=>'this is a string' 
+0

Это должно работать. Почему не так? Какие ошибки вы получаете? Что произойдет, если вы используете Data :: Dumper; print Dumper \% hash'? – Sobrique

+2

Это работает отлично. Если вы не видите желаемых результатов, это связано с тем, что у вас есть ошибка в другом месте вашего скрипта, и вы неправильно идентифицировали проблемную область. Создайте и опубликуйте короткий и полный сценарий, демонстрирующий проблему, с которой вы сталкиваетесь. –

+0

(также нет ссылок в этом примере. Полезно использовать правильную терминологию. 'Key' - это просто ключ хеша, а' 'this is 'является значением хэша. Ничего не упоминается.) –

ответ

3

Всегда используйте следующий !!!

use strict; 
use warnings qw(all); 

Он указал бы на вашу ошибку.

Вы изменяете хэш %hash, но такого хеша нет! Вы хотите изменить хэш, на который ссылается $hash, так что вы хотите

use Data::Dumper qw(Dumper); 

sub f { 
    my $hash = shift; 
    $hash->{key} .= ' string'; 
} 

my %hash = (key => 'this is a'); 
f(\%hash); 
print(Dumper(\%hash)); 
1

Вы предположительно внутри подпрограммы, и вы подбирая хэш-ССЫЛКА, а не хэш. Вы должны разыменовать это так:

%{$hashref} # dereferenced hashref (just like a hash) 

${$hashref}{key} # access your key (just like a hash) 

или:

$hashref->{key} # access your key, shorthand style 

Обратите внимание на стрелку в сокращенном варианте!

Для получения дополнительной информации, проверьте:

perldoc perlreftut # MJD's references tutorial 

(доступен в Интернете по адресу http://perldoc.perl.org/perlreftut.html)