抛出'不是ARRAY引用'错误

时间:2015-07-09 23:39:37

标签: mysql perl

我正在编写一个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表(技术上程序可以工作,但我不想在其中留下错误)。

有人有什么建议吗?

1 个答案:

答案 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++;
  }
}