强制循环以特定元素开始? (Perl的)

时间:2013-12-23 12:42:29

标签: perl

我正在打开一个与LWP的链接,并且在回复中还有其他链接我想要打开,以便//DoSomething在每个链接上,其中有我刚刚打开的链接,我想这有点令人困惑,这里是我正在使用的代码:

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没有按照推送顺序循环遍历数组,因为我在开始时尝试push @links, topic;然后确保{{ 1}}在每个@links之前没有$topic之类的链接,但它不起作用,换句话说,我想跳过两次打开链接或以正确的推送顺序打印。

提前致谢

1 个答案:

答案 0 :(得分: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