-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;

識別された問題を修正します。専門家はそれらを使用して、ばかげた間違いをしないようにします。初心者は同じ理由でそれらを使用する必要があります。

表示されているコードには、少なくとも 4 つのベアワードがあります。

初期化の構文@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ます。正確に間違っているわけではありませんが、異常です。orを代わりmyに使用する明確な理由がない限り使用してください。localour

于 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 に答える