【问题标题】:How to skip 'die' in perl如何在 perl 中跳过“死”
【发布时间】:2011-07-13 22:02:01
【问题描述】:

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

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

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

谢谢你, 萨默德

【问题讨论】:

  • 嗯...不要成为一个聪明人或任何东西,但如果你不想让程序死掉,不要使用die?你不能让它既死又不死。
  • @ TLP .Good one..问题是我想跳过错误并继续前进,这就是我想要做的..
  • 也许只是将“死”改为“警告”。

标签: perl data-mining


【解决方案1】:

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

next unless @tags;

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

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

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

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

【讨论】:

  • 感谢您的回答。是的,我在一个循环中执行此操作,处理 while 循环中的每个 URI。我只是想确认一下语法,会不会是这样的:'my @tags = $c->posts_for(uri =>"$currentURI");下一个除非@tags;'
【解决方案2】:

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

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

或者只使用Try::Tiny

但是,从任务的描述来看,next 似乎就足够了(所以我投票给了@paxdiablo 的答案)。

【讨论】:

    【解决方案3】:

    这个问题很奇怪,但据我所知,您问的是如何控制当前循环的流量。当然,使用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,因为它不是必需的。如果没有“标签”,内部循环将运行零次。

    这并不是真正复杂的东西,如果您不确定,我建议您尝试一下循环和条件以了解它们的工作原理。

    【讨论】:

    • @TLP..谢谢您的回答。好吧,我正在学习一些条件和循环。我想我明白了。感谢您的帮助。
    猜你喜欢
    • 2014-10-01
    • 2010-09-23
    • 2023-03-28
    • 1970-01-01
    • 2010-10-17
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多