Perl中的for循环(如何使用每个url执行某些操作)

时间:2013-02-20 15:26:25

标签: perl

看看@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=");

2 个答案:

答案 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个变量。这不是完全错误的,但这是不寻常的。除非您有明确的理由使用mylocal,否则请使用our

答案 1 :(得分:2)

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

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

并且,正如其他人所说的,始终use strict; use warnings;,特别是作为初学者。