-4

看看@arr 和@arre,因为我在第 20 行遇到错误:在 test.pl 第 20 行使用“strict refs”时不能使用字符串 ("") 作为 HASH ref。

第 20 行for our $post (@{ $resp->{data} }) {

sub graph_api {

  unlink "data.txt";
  open(MYFILE2, ">data.txt");
  close(MYFILE2);

  our @arr = (
    "me/inbox?fields=comments.limit(2)&limit=1",
    "me/home?fields=name,link,from,story,is_hidden,message&limit=1"
  );

  foreach our $arre (@arr) {
    my $uri = new URI("https://graph.facebook.com/" . $arre . "&access_token=");

    chomp(my $content = get $uri);
    die "Couldn't get $uri" unless defined $content;

    our $resp = get("$uri");

    defined $resp ? decode_json($resp) : undef;
  }

但是当我改变这个 pert 时一切正常:

our @arr = ("me/inbox?fields=comments.limit(2)&limit=1","me/home?fields=name,link,from,story,is_hidden,message&limit=1");

  my $uri = new URI("https://graph.facebook.com/".$arr[0]."&access_token=");
4

2 回答 2

6

最初的问题

问题的原始版本询问了代码片段:

my @arr(somting somting1); 
for my $i(0 .. $#arr){ 
    my url = get (www.$arr[$i].com); 
    do something with url... 
}

该问题已被更新,丢失了此信息。

初步反应

添加:

use strict;
use warnings;

并修复它发现的问题。专家使用它们来确保他们不会犯愚蠢的错误。出于同样的原因,初学者需要使用它们。

显示的代码中至少有四个裸字。

初始化的语法@arr是错误的。使用其中之一:

my @arr = ( "somting", "somting1" );
my @arr = qw( somting somting1 );

你需要在你的论点周围加上双引号get

get("www.$arr[$i].com");

更惯用的 Perl 会使用:

for my $core (@arr)
{
    my $url = get("www.$core.com");
    ...check...use...
}

对修订问题的回应

您收到错误消息:

Can't use string ("") as a HASH ref while "strict refs" in use at test.pl line 20.

在第 20 行,显然是:

for our $post (@{ $resp->{data} }) {

该表示法$resp->{data}试图将$resp其视为哈希引用,但$resp不是哈希引用。您的代码包含:

defined $resp ? decode_json($resp) : undef;

它表明循环中$resp可能未定义for,或者它包含需要解码的字符串(可能是一些 JSON)。你也许是说:

$resp = (defined $resp) ? decode_json($resp) : undef;

我很感兴趣您使用的是our变量而不是my变量。这并不完全是错误的,但它是不寻常的。my除非您有明确的理由使用localor ,否则请使用our

于 2013-02-20T15:36:33.720 回答
2

不要使用这样的索引变量来循环你的数组。像这样直接遍历数组:

my @domains = ( ... );
for my $domain ( @domains ) {
    my $url = "http://www.$host.com";
    ...
}

而且,正如其他人所说,总是use strict; use warnings;,尤其是作为初学者。

于 2013-02-20T15:37:24.703 回答