2013-11-14 3 views
1

Я храню хеш-ссылки из потоков в общую переменную @stories, а затем не могу получить к ним доступ.не может получить хеш-значение из hashref

my @stories : shared=(); 

    sub blah { 
    my %stories : shared=(); 
    <some code> 
     if ($type=~/comment/) { 
      $stories{"$id"}="$text"; 
      $stories{"$id"}{type}="$type"; 
      lock @stories; 
      push @stories, \%stories; 
     } 
    } 

# @stories is a list of hash references which are shared from the threads;

   foreach my $story (@stories) { 
       my %st=%{$story}; 
       print keys %st;  # <- printed "8462529653954" 
       print Dumper %st;  # <- OK 
       my $st_id = keys %st; 
       print $st_id;   # <- printed "1" 
       print $st{$st_id};  # <- printed "1/8" 
      } 

print keys %st works as expected but when i set in to a variable and print, it returns "1".

Could you please advice what I'm doing wrong. Thanks in advance.

+2

Что вы ожидаете от этого? '$ st_id = keys% st' совпадает с' $ st_id = scalar (keys% st) ', что означает' $ st_id' количество ключей в хэш '% st'. – mob

+0

Я ожидаю, что $ st_id станет ключом. т. е. 8462529653954. –

+0

Знаете ли вы, что 'my% st =% {$ story}' делает копию хэша? Любые изменения, внесенные вами в '% st', не отражаются в исходном хэш-файле. – cjm

ответ

3

In scalar context, keys %st возвращает количество элементов в хэш %st.

%st = ("8462529653954" => "foo"); 
$st_id = keys %st; 

print keys %st;    # "8462529653954" 
print scalar(keys %st);  # "1" 
print $st_id;    # "1" 

Чтобы извлечь один ключ из %st, сделать задание из keys %st в контексте списка.

my ($st_id) = keys %st;  # like @x=keys %st; $st_id=$x[0] 
print $st_id;    # "8462529653954" 
+0

Это работает, спасибо. Но на самом деле я не понимаю, почему ключи% st - это список? –

+0

@TigranKhachikyan, потому что хэш обычно имеет более 1 ключа. – cjm

+0

получил это :) Спасибо. –

Смежные вопросы