2013-02-20 4 views
1

У меня есть вопрос. Я надеюсь, что вы сможете помочь, поскольку я новичок в хэшах и хеш-справочных материалах?Perl, обращающийся к элементам в хеш-хеш-справочной структуре данных

У меня есть следующие структуры данных:

$VAR1 = { 
    'http://www.superuser.com/' => { 
     'difference' => { 
      'http://www.superuser.com/questions' => '10735', 
      'http://www.superuser.com/faq' => '13095' 
     }, 
     'equal' => { 
      'http://www.superuser.com/ ' => '20892' 
     } 
    }, 
    'http://www.stackoverflow.com/' => { 
     'difference' => { 
      'http://www.stackoverflow.com/faq' => '13015', 
      'http://www.stackoverflow.com/questions' => '10506' 
     }, 
     'equal' => { 
      'http://www.stackoverflow.com/ ' => '33362' 
     } 
    } 

Если я хочу, чтобы получить доступ ко всем URL, в ключе 'difference' так что я могу затем выполнить некоторые другие действия по URL, то, что является правильным или предпочтительным методом доступ к этим элементам?

например, я в конечном итоге со следующими URL-адреса, которые я могу после этого сделать материал, чтобы в foreach цикле с:

http://www.superuser.com/questions 
http://www.superuser.com/faq 
http://www.stackoverflow.com/faq 
http://www.stackoverflow.com/questions 

------ EDIT ------

Код для доступа к элементам, расположенным дальше по структуре данных, приведенной выше:

my @urls; 
foreach my $key1 (keys(%{$VAR1})) { 
    print("$key1\n"); 
    foreach my $key2 (keys(%{$VAR1->{$key1}})) { 
     print("\t$key2\n"); 
    foreach my $key3 (keys(%{$VAR1->{$key1}{$key2}})) { 
     print("\t\t$key3\n"); 
    push @urls, keys %{$VAR1->{$key1}{$key2}{$key3}}; 
    } 
    } 
} 
print "@urls\n"; 

Используя приведенный выше код, почему возникает следующая ошибка?

Can't use string ("13238") as a HASH ref while "strict refs" in use at ....

ответ

7

Это не сложно, просто взять второй уровень ключей офф каждый ключ в переменной:

my @urls; 
for my $key (keys %$VAR1) { 
    push @urls, keys %{$VAR1->{$key}{'difference'}}; 
} 

Если вы боретесь с разыменования, просто имейте в виду, что все значения в хеше или массиве может быть только скалярным значением. В многоуровневом хеше или массиве уровни - это только отдельные хэши/массивы, уложенные друг на друга.

Например, вы могли бы сделать:

for my $value (values %$VAR1) { 
    push @urls, keys %{$value->{'difference'}}; 
} 

Или

for my $name (keys %$VAR1) { 
    my $site = $VAR1->{$name}; 
    push @urls, keys %{$site->{'difference'}}; 
} 

..taking маршрут либо непосредственно по значению (ссылка на хэш) или по временной переменной, представляющей значение через ключ. Есть еще что читать в perldoc perldata.

+0

спасибо, что именно то, что я искал. Как бы выглядел код, если бы я хотел получить доступ только к номерам в конце каждого URL-адреса stackoverflow, то есть '13015',' 10506' и '33362'. Мне нужно узнать, как обращаться к различным частям структуры данных, спасибо за вашу помощь. –

+0

Не могли бы вы показать мне, что будет делать код, если бы я хотел получить доступ только к номерам в конце каждого URL-адреса stackoverflow i.e 13015, 10506 и 33362. Большое спасибо –

+1

@ perl-user. Это просто. Значение ключа '' http: // www.stackoverflow.com/''является хеш-кодом. Ключи в этом хэш-ref - это '' difference'' и ''equal'', а их значения также являются хэш-ссылками. Значения этих хэш-ссылок являются значениями, которые вы после. Просто складывайте циклы 'for', и все будет хорошо. Проверьте свои результаты с помощью «Data :: Dumper», если вы не знаете, что происходит. – TLP

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