Perl 如何破译散列数组?

Perl 如何破译散列数组?,perl,perl-hash,Perl,Perl Hash,我完全把这个问题搞错了。Am使用TMDB中的方法: my @results = $search->find(id => 'tt0114694', source => 'imdb_id'); 我认为输出是JSON格式的,所以这让我很困惑,这让我一直在循环运行,因为我看错了 我没有意识到下面的数据,来自Dumper,是我必须经过的实际哈希 这是我遇到墙的地方,所以下面的数据是一个有五个键的散列。第五个键,我想要的,包含另一个数组。这就是我无法读入的数组。我尝试将其解引用

我完全把这个问题搞错了。Am使用TMDB中的方法:

 my @results = $search->find(id     => 'tt0114694', source => 'imdb_id');
我认为输出是JSON格式的,所以这让我很困惑,这让我一直在循环运行,因为我看错了

我没有意识到下面的数据,来自Dumper,是我必须经过的实际哈希

这是我遇到墙的地方,所以下面的数据是一个有五个键的散列。第五个键,我想要的,包含另一个数组。这就是我无法读入的数组。我尝试将其解引用为散列,但这就是我失败的地方

我正在尝试的代码是:

foreach my $narray (@results){
    print $narray->{"movie_results"};
    my @newarray = $narray->{"movie_results"};

    foreach my $otherarray (@newarray){
        my %innerhash = $otherarray;
        print %innerhash;
        print "\n";
    }
  } 
它将打印出一个数组,但我无法读取该数组中的哈希值

p、 我必须将这个输出格式化为代码,否则它就没有换行符了


%newhash{$newkey}
应该是
$newhash{$newkey}
%newhash{$newkey}
应该是
$newhash{$newkey}

处理引用时,使用与未使用相同的语法,但用返回引用的块替换变量名称

%NAME->%{$ref}或仅%$ref
$NAME{…}->${$ref}{…}虽然$ref->{…}更容易阅读。
@名称->@{$ref}或仅@$ref
$NAME[…]->${$ref}[…]虽然$ref->[…]更容易阅读。
让我们给
$VAR
起个更好的名字

my$response=$VAR1;
这意味着你想要

my$results=$response->{movie_results};
对于我的$result(@$results){
对于我的$key(key(%$result)){
说“$key:$result->{$key}”;
}
}


处理引用时,使用与未使用相同的语法,但用返回引用的块替换变量名称

%NAME->%{$ref}或仅%$ref
$NAME{…}->${$ref}{…}虽然$ref->{…}更容易阅读。
@名称->@{$ref}或仅@$ref
$NAME[…]->${$ref}[…]虽然$ref->[…]更容易阅读。
让我们给
$VAR
起个更好的名字

my$response=$VAR1;
这意味着你想要

my$results=$response->{movie_results};
对于我的$result(@$results){
对于我的$key(key(%$result)){
说“$key:$result->{$key}”;
}
}


您提到您以为可以得到JSON输出,但得到了其他东西。模块为您发出web请求,接收JSON响应,并将其转换为Perl数据结构。这个JSON的Perl版本就是您在转储中看到的

JSON对象会变成Perl哈希,因此这就是您在数据结构顶层看到的内容。这是
find
返回的唯一内容(稍后将详细介绍):

下面是您所拥有的,删除外部
foreach
循环:

my @newarray = $narray->{"movie_results"};

foreach my $otherarray (@newarray){
    my %innerhash = $otherarray;
    print %innerhash;
    print "\n";
}
$narray->{“movie_results”}
中的值是数组引用。所有引用都是标量,这些标量指向某些数据结构。当您将该标量指定给数组时,您只需要得到一个与引用相同的单元素数组。相反,你可以

my $movie_results = $narray->{"movie_results"};
然后取消引用该引用以将其视为数组:

foreach my $result ( @$movie_results ){ ... }
或者,我发现v5.24的方式更令人愉快,因为它读起来更好,特别是当您跳过中间变量时:

foreach my $result ( $movie_results->@* ){ ... }

foreach my $result ( $narray->{"movie_results"}->@* ){ ... }
$result
中的内容是另一个哈希引用

引用和数据结构约占的内容的一半,但也有

稍微改进一下你的问题 通过向我们展示您的问题的完整、有效的演示,您可以帮助我们很多。以下是我拼凑的:

use v5.10;

use TMDB;
use Data::Dumper;

my $tmdb = TMDB->new( apikey => $ENV{TMDB_API_KEY} );
my @results = $tmdb->search->find(
    id     => 'tt0114694',
    source => 'imdb_id'
    );

say Dumper( \@results );
有一个关于
find
的结果的问题。文档示例显示它返回一个列表(好吧,结果被分配给一个命名数组,这意味着),但是没有实际的
find
文档。它从响应返回解码的JSON。将其指定给标量(将作为引用)也可以:

my $result = $tmdb->search->find(
    id     => 'tt0114694',
    source => 'imdb_id'
    );

say Dumper( $results );
返回值来自
TMDB::sessession::talk()
,它就是这个(或空列表):

那没什么大不了的。这只是意味着您不需要外部
foreach
。这不关你的事,因为文档中的例子告诉你要做你所做的事情

现在是一个更好的计划 综上所述,这里有一个简单的程序,简化为您需要的:

use v5.10; 
use TMDB;

my $tmdb = TMDB->new( apikey => $ENV{TMDB_API_KEY} );
my $result = $tmdb->search->find(
    id     => 'tt0114694',
    source => 'imdb_id'
    );

foreach my $item ( $result->{movie_results}->@* ) {
    say "Title: $item->{title}";
    }
参考别名 有一个名为的实验特性,可以让您将引用指定给命名变量的引用。它是一个别名,因此您可以访问和更改相同的数据,只需使用命名变量即可。当你不喜欢的时候,这个很方便

use v5.10;

use TMDB;
use experimental qw(refaliasing);

my $tmdb = TMDB->new( apikey => $ENV{TMDB_API_KEY} );

# response is a hash ref, so ref alias to a named hash
\my %result = $tmdb->search->find(
    id     => 'tt0114694',
    source => 'imdb_id'
    );

# the part you want is an array ref, so alias that
\my @movie_results = $result{movie_results};

# each item in the array is a hash ref, so alias those too
foreach \my %item ( @movie_results ) {
    say "Title: $item{title}";
    } 

您提到您认为可以得到JSON输出,但得到了其他东西。模块为您发出web请求,接收JSON响应,并将其转换为Perl数据结构。这个JSON的Perl版本就是您在转储中看到的

JSON对象会变成Perl哈希,因此这就是您在数据结构顶层看到的内容。这是
find
返回的唯一内容(稍后将详细介绍):

下面是您所拥有的,删除外部
foreach
循环:

my @newarray = $narray->{"movie_results"};

foreach my $otherarray (@newarray){
    my %innerhash = $otherarray;
    print %innerhash;
    print "\n";
}
$narray->{“movie_results”}
中的值是数组引用。所有引用都是标量,这些标量指向某些数据结构。当您将该标量指定给数组时,您只需要得到一个与引用相同的单元素数组。相反,你可以

my $movie_results = $narray->{"movie_results"};
然后取消引用该引用以将其视为数组:

foreach my $result ( @$movie_results ){ ... }
或者,我发现v5.24的方式更令人愉快,因为它读起来更好,特别是当您跳过中间变量时:

foreach my $result ( $movie_results->@* ){ ... }

foreach my $result ( $narray->{"movie_results"}->@* ){ ... }
$result
中的内容是另一个哈希引用

引用和数据结构约占的内容的一半,但也有

稍微改进一下你的问题 你可以通过展示给我们很多帮助