看看@arr和@arre,我发现错误: 第20行: 在test.pl第20行使用“strict refs”时,不能使用字符串(“”)作为HASH引用。
第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;
}
但是当我改变这个时,一切正常:
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=");
答案 0 :(得分: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
或local
,否则请使用our
。
答案 1 :(得分:2)
不要使用这样的索引变量来循环遍历数组。像这样直接迭代数组:
my @domains = ( ... );
for my $domain ( @domains ) {
my $url = "http://www.$host.com";
...
}
并且,正如其他人所说的,始终use strict; use warnings;
,特别是作为初学者。