2013-12-23 46 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的順序遍歷數組因爲我試圖在push @links, topic;開頭,然後確保@links在每個push @links, $link_?之前都沒有鏈接,如$topic,但它不起作用,換句話說,我想跳過打開鏈接兩次或按正確順序打印。

在此先感謝

回答

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,我想到的是使用AA哈希代替,不過,我想迫使我環路開始與'$ topic'第一然後繼續其餘的,我不知道是否有可能 – Mugiwara

+0

@Mugiwara看看更新的答案,顯示如何只下載主題,如果它不存在。 – Joel

+0

非常感謝@Joel:D – Mugiwara