我正在编写一个Perl脚本,用于处理API,该API返回有关我从MySQL提取的一组URL的指标,然后将这些指标发布回另一个表。目前这段代码:
my $content = $response->content;
my $jsontext = json_to_perl($content);
my $adsql = 'INSERT INTO moz (url_id,page_authority,domain_authority,links,MozRank_URL,MozRank_Subdomain,external_equity_links) VALUES (?,?,?,?,?,?,?)';
my $adrs = $db->prepare( $adsql );
my $adsql2 = 'UPDATE url
SET moz_crawl_date = NOW()
where url_id = ?;';
my $adrs2 = $db->prepare( $adsql2 );
my $currentUrlId = 0;
foreach my $row (@$jsontext){
$adrs->execute($url_ids[$currentUrlId], $row->{'fmrp'}, $row->{'upa'}, $row->{'pda'}, $row->{'uid'}, $row->{'umrp'}, $row->{'ueid'});# || &die_clean("Couldn't execute\n$adsql\n".$db->errstr."\n" );
$adrs2->execute($url_ids[$currentUrlId]);
$currentUrlId++;
}
抛出此错误:
Not an ARRAY reference at ./moz2.pl line 124.
这是第124行:
foreach my $row (@$jsontext){
这整段代码都在while
循环中。我实际上能够迭代几次并在脚本失败之前填充我的MySQL表(技术上程序可以工作,但我不想在其中留下错误)。
有人有什么建议吗?
答案 0 :(得分:0)
Perl给了你正确答案
Not an ARRAY reference: @$jsontext
您正在将$jsontext
解除引用,这是json_to_perl(string)
的结果。
但是json_to_perl()
没有返回arrayref。
json_to_perl 似乎来自此API:http://search.cpan.org/~bkb/JSON-Parse-0.31/lib/JSON/Parse.pod#json_to_perl 根据文档返回一个arrayref或hashref。
显然它确实在你的情况下返回了一个hashref,所以你必须添加逻辑来处理HASH情况。这似乎是一排。
if (ref $jsontext eq 'HASH') {
# seems to be a single row
$adrs->execute($url_ids[$currentUrlId], $jsontext->{'fmrp'}, $jsontext->'upa'}, $jsontext->'pda'}, $jsontext->'uid'}, $jsontext->'umrp'}, $jsontext->'ueid'});# || &die_clean("Couldn't execute\n$adsql\n".$db->errstr."\n" );
$adrs2->execute($url_ids[$currentUrlId]);
$currentUrlId++;
} elsif (ref $jsontext eq 'ARRAY') {
foreach my $row (@$jsontext){
$adrs->execute($url_ids[$currentUrlId], $row->{'fmrp'}, $row->{'upa'}, $row->{'pda'}, $row->{'uid'}, $row->{'umrp'}, $row->{'ueid'});# || &die_clean("Couldn't execute\n$adsql\n".$db->errstr."\n" );
$adrs2->execute($url_ids[$currentUrlId]);
$currentUrlId++;
}
}