2013-02-13 4 views
-1

У меня есть вопрос. Я надеюсь, что вы могли бы помочь?Perl WWW: Механизировать Доступ к данным в хеш-ссылке

Это последняя часть мне нужна помощь в понимании ссылок на хэши

Код:

my $content_lengths; # this is at the top 
foreach my $url (# ... more stuff 

# compare 
if ($mech->response->header('Content-Length') != $content_length) { 
    print "$child_url: different content length: $content_length vs " 
    . $mech->response->header('Content-Length') . "!\n"; 

    # store the urls that are found to have different content 
    # lengths to the base url only if the same url has not already been stored 
    $content_lengths->{$url}->{'different'}->{$child_url} = $mech->response->header('Content-Length'); 

} elsif ($mech->response->header('Content-Length') == $content_length) { 
    print "Content lengths are the same\n"; 

    # store the urls that are found to have the same content length as the base 
    # url only if the same url has not already been stored 
    $content_lengths->{$url}->{'equal'}->{$child_url} = $mech->response->header('Content-Length'); 
} 

Что это выглядело, как с помощью Data :: Dumper

$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 из ссылки хэш (т.е. от Data :: Dumper, который будет http://www.superuser.com/ и http://www.stackoverflow.com/)

и как я печатаю все$child_url или частности один/подмножество от $child_url и так далее?

Ваша помощь с этим очень ценится,

Большое спасибо

ответ

1

Вы можете провести ваш hashref таким образом:

$hashref->{key1}{key2}{keyN}; 

Например, если вы хотите суперпользователя равную ветвь:

my $urlArrayref = $hashref->{'http://www.superuser.com/'}{'equal'}; 

Больше к точке, чтобы напечатать URL (первый ключ уровень) hashref, вы могли бы сделать:

foreach my $key (keys(%{$hashref})) { 
    print("key is '$key'\n"); 
} 

Затем, если вы хотите ключи второго уровня:

foreach my $firstLevelKey (keys(%{$hashref})) { 
    print("first level key is '$firstLevelKey'\n"); 
    foreach my $secondLevelKey (keys(%{$hashref->{$firstLevelKey}})) { 
     print("\tfirst level key is '$secondLevelKey'\n"); 
    } 
} 

и так далее. ..

----- EDIT -----

Это работает пример кода из вашего примера выше:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $content_lengths = { 
    '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' 
     } 
    } 
}; 

foreach my $key1 (keys(%{$content_lengths})) { 
    print("$key1\n"); 
    foreach my $key2 (keys(%{$content_lengths->{$key1}})) { 
     print("\t$key2\n"); 
     foreach my $key3 (keys(%{$content_lengths->{$key1}{$key2}})) { 
      print("\t\t$key3\n"); 
     } 
    } 
} 

Каких результатов этого вывод:

http://www.superuser.com/ 
     difference 
       http://www.superuser.com/questions 
       http://www.superuser.com/faq 
     equal 
       http://www.superuser.com/ 
http://www.stackoverflow.com/ 
     difference 
       http://www.stackoverflow.com/faq 
       http://www.stackoverflow.com/questions 
     equal 
       http://www.stackoverflow.com/ 
+0

Привет, смогли бы вы показать мне, что код будет выглядеть для моих примеров, пожалуйста, как когда я, чтобы сделать 'foreach' используя ваш пример в качестве шаблона я получаю такие ошибки, как «Тип аргумента 1 для ключей должен быть хешем (а не разыменованием массива)»?спасибо за вашу помощь –

+0

Я не могу получить некоторые данные, если я использую 'foreach my $ здесь (ключи% {$ content_lengths}) { print (" key is '$ here' \ n "); } '? но не когда я использую 'foreach my $ key (ключи (@ {$ content_lengths})) { print (" key is '$ key' \ n ");' }? –

+1

@ perl-user, извините, что это была опечатка ... должно было быть 'keys (% {$ content_lengths})', как вы выяснили. Я обновил свой ответ выше. – Lucas