如何在perl中跳过'die'

时间:2011-07-13 00:30:00

标签: perl data-mining

我正在尝试使用perl API从网站中提取数据。该过程是使用uris列表作为输入。然后我从网站上提取每个uri的相关信息。如果一个uri的信息不存在,它就会死亡。有点像下面的代码

my @tags = $c->posts_for(uri =>"$currentURI");
die "No candidate related articles\n" unless @tags;

现在,如果程序没有获得任何标记,我不希望程序停止。我希望程序跳过那个特定的uri并转到下一个可用的uri。我该怎么做? 感谢您的时间和帮助。

谢谢你, Sammed

3 个答案:

答案 0 :(得分:5)

好吧,假设您在一个循环中依次处理每个URI,您应该可以执行以下操作:

next unless @tags;

例如,以下程序仅打印数字行:

while (<STDIN>) {
    next unless /^\d+$/;
    print;
}

循环依次处理每个输入行,但是当发现一个与正则表达式(全数字)不匹配时,它会重新启动循环(对于下一个输入行)而不打印

如果没有标签,移动到下一个URI,则在上面的第一个代码块中使用相同的方法重新启动循环。

答案 1 :(得分:0)

除了传统的流控制工具,即循环中的next / last或子中的return,可以在perl中使用异常:

eval {
    die "Bad bad thing";
};
if ($@) {
    # do something about it
};

或者只使用Try::Tiny

然而,从任务的描述来看,似乎next已经足够了(所以我选择了@ paxdiablo的回答)。

答案 2 :(得分:0)

这个问题很奇怪,但就我所知,你问的是如何控制当前循环的流量。当然,使用die会导致程序退出,因此如果您不希望这样,则不应使用die。对我来说似乎很小,这就是为什么这是一个奇怪的问题。

所以,我假设你有一个循环,如:

for my $currentURI (@uris) {
    my @tags = $c->posts_for(uri =>"$currentURI");
    die "No candidate related articles\n" unless @tags;
    # do stuff with @tags here....
}

如果@tags为空,则需要转到下一个URI。嗯,这是一个很容易解决的问题。有很多方法。

next unless @tags;
for my $tag (@tags) { ... stuff ... }
if (@tags) { .... }

接下来是最简单的一个。它跳到循环块的末尾并从下一次迭代开始。但是,使用forif块会导致相同的行为,因此是等效的。例如:

for my $currentURI (@uris) {
    my @tags = $c->posts_for(uri =>"$currentURI");
    for my $tag (@tags) {
        do_something($tag);
    }
}

甚至:

for my $currentURI (@uris) {
    for my $tag ($c->posts_for(uri =>"$currentURI")) {
        do_something($tag);
    }
}

在最后一个示例中,我们一起删除了@tags,因为它不是必需的。如果没有“标签”,内部循环将运行零次。

这不是很复杂的东西,如果你觉得不确定,我建议你玩一些循环和条件来学习它们是如何工作的。