我正在尝试使用perl API从网站中提取数据。该过程是使用uris列表作为输入。然后我从网站上提取每个uri的相关信息。如果一个uri的信息不存在,它就会死亡。有点像下面的代码
my @tags = $c->posts_for(uri =>"$currentURI");
die "No candidate related articles\n" unless @tags;
现在,如果程序没有获得任何标记,我不希望程序停止。我希望程序跳过那个特定的uri并转到下一个可用的uri。我该怎么做? 感谢您的时间和帮助。
谢谢你, Sammed
答案 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) { .... }
接下来是最简单的一个。它跳到循环块的末尾并从下一次迭代开始。但是,使用for
或if
块会导致相同的行为,因此是等效的。例如:
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
,因为它不是必需的。如果没有“标签”,内部循环将运行零次。
这不是很复杂的东西,如果你觉得不确定,我建议你玩一些循环和条件来学习它们是如何工作的。