2013-12-23 2 views
0

Я открываю ссылку с LWP, и в ответ есть другие ссылки, которые я хочу открыть тоже, чтобы //DoSomething на каждом из них, и среди них есть ссылка, которую я только что открыл, я думаю, это немного сбивает с толку, а вот код, я использую:Настроить цикл, чтобы начать с определенного элемента? (Perl)

my $request = GET $topic; 
my $response = $ua->request($request); 
usleep(52000); 

my $tree = HTML::TreeBuilder->new(); 
$tree->parse($response->decoded_content); 

my $link_1 = $tree->look_down('id' => 'link_1')->look_down('_tag' => 'a')->attr('href'); 
my $link_2 = $tree->look_down('id' => 'link_2')->look_down('_tag' => 'a')->attr('href'); 
my $link_3 = $tree->look_down('id' => 'link_3')->look_down('_tag' => 'a')->attr('href'); 

//then i insert them in an array 

push @links, $link_1; 
push @links, $link_2; 
push @links, $link_3; 

теперь, например, что $link_2 и $topic такие же

foreach my $link (@links) 
{ 
    if($link ne $topic) 
    { 
     $request = GET $link; 
     $response = $ua->request($request); 
     usleep(52000); 

     $tree = HTML::TreeBuilder->new(); 
     $tree->parse($response->decoded_content); 
    } 


    $json = $tree->look_down('id' => 'json_text')->attr('_content')->[0]; 
} 

что я хочу сейчас, чтобы не открыть ссылку дважды, Потому что perl не проходит через массив, соблюдая порядок p ush, cuz я попытался в push @links, topic; прямо в начале, а затем удостоверьтесь, что @links не имеет ссылки вроде $topic перед каждым push @links, $link_?, но это не работает, другими словами, я хочу пропустить открытие ссылки дважды или напечатать в правильном порядке нажатия ,

заранее спасибо

ответ

2

трюка я использую для такого рода проблемы заключается в использовании хэша вместо массива. Массив - отличный элемент, когда вам нужен список заказов элементов, тогда как хеш - отличный элемент, когда вы хотите индексировать список, упорядоченный UN. Итак, для вас проблемы, я хотел бы использовать решение, как таким образом:

my %links 
# then i insert them in a hash 

$links{$link_1} = 1; 
$links{$link_2} = 1; 
$links{$link_3} = 1; 

Затем, чтобы проверить наличие ссылки:

foreach my $link (keys(%links)) 
{ 
    if($link ne $topic) 
    { 
     # and so on and so forth 

Я считаю, что это ответ на ваш вопрос. Если я не понял ваш вопрос и не привел вас к неправильному пути, дайте мне знать.

Обновление от комментариев:

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

if (!defined($links{$topic})) { 
    # and so on and so forth 
+0

Спасибо: D, я имею в виду об использовании аа хэш вместо этого, однако я хочу, чтобы заставить мой цикл, чтобы начать с '$ topic' первый затем продолжайте с остальными, я не знаю, возможно ли это. – Mugiwara

+0

@ Mugiwara Взгляните на обновленный ответ, в котором показано, как загружать только те темы, если они не существуют. – Joel

+0

Большое спасибо @Joel: D – Mugiwara

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