sma*_*ape 0 api perl data-mining
我正在尝试使用Perl API从网站中提取数据.我正在使用URI列表来从网站获取数据.
最初的问题是,如果没有可用于URI的数据,它将会死亡,我希望它跳过该特定的URI并转到下一个可用的URI.我曾经next unless ....;遇到过这个问题.
现在问题是我试图通过从API调用特定方法(称为标识符())来从Web提取特定数据.现在数据可用于URI,但是我正在寻找的特定数据(标识符)不可用而且它已经死亡.
我试着像这样使用eval {}
eval {
for $bar ($foo->identifiers()){
#do something
};
}
Run Code Online (Sandbox Code Playgroud)
当我使用eval {}时,我认为它会跳过错误并向前移动,但我不确定.因为它给出的错误是"响应中的内容类型无效:text/plain".
我手动检查了URI,虽然它没有标识符,但它有其余的数据.我希望这跳过并转移到下一个URI.我怎样才能做到这一点?
我得到了一位专家的回复: 当Perl遇到错误时,就像大多数语言一样,它会在调用上下文中按顺序运行,直到它找到一个可以处理错误的地方.Perl最基本的错误处理是eval {}(但是如果可以的话,我会使用Try :: Tiny,因为更清楚的是你正在进行错误处理而不是eval可以做的其他一些奇怪的事情).无论如何,当Perl命中eval {}时,整个eval {}退出,$&设置为错误.因此,在循环外部使用eval {}意味着错误将离开循环.如果将eval {}放在循环中,当发生错误时,eval {}将退出,但您将继续进行下一次迭代.就这么简单.
但实际上我得到的错误是响应中的无效内容类型:mycode第41行的text/html和我的代码中的第41行(我的程序)实际上是来自web的数据.我知道代码中没有错误,因为它适用于以前的uris.现在,我该如何修复此错误并继续前进到下一个uri?我的程序坚持这个错误.
我现在假设您的代码看起来像这样:
while (<IN0>) {
my $currentURI = $_;
chomp($currentURI);
my @tags = $c->posts_for(uri =>"$currentURI");
... do something ...
}
Run Code Online (Sandbox Code Playgroud)
要安全地处理错误,请使用类似的东西(假设eval()):
while (<IN0>) {
my $currentURI = $_;
chomp($currentURI);
my @tags = eval { # Use eval to make this safe, $@ will contain any error
$c->posts_for(uri =>"$currentURI");
}
my $error = $@;
if (defined($error)) {
warn($error); # If eval failed, warn and skip to next line
next;
}
if (! @tags) {
next; # Assuming no tags means go to next line in input
}
... do something ...
}
Run Code Online (Sandbox Code Playgroud)
所有eval确实这里是保证能够被处理Perl的错误离开eval块以正常的方式,但如果出现这种情况,@tags将是空的,$@将包含错误.如果$@已设置,则剩余的逻辑警告(并跳过输入行).如果没有标签,你可能想要跳过这条线.