2015-07-20 56 views
0

我很难从嵌套数组中检索数据。在下面的自卸车结果的HTTP响应::转换成JSON结果的结果:如何从这个嵌套数组中检索数据?

$VAR1 = [ 
      'FE93DEC4505772CE9CFCE353A1F07027A165032F', 
      [ 
      [ 
       'myshow.S01E03.HDTV.x264-ASAP.mp4', 
       192494228, 
       192494228, 
       2, 
       0, 
       735, 
       bless(do{\(my $o = 1)}, 'JSON::PP::Boolean'), 
       0, 
       0, 
       0, 
       0, 
       -1, 
       0 
      ], 
      [ 
       'Downloaded.txt', 
       172, 
       172, 
       2, 
       734, 
       1, 
       bless(do{\(my $o = 0)}, 'JSON::PP::Boolean'), 
       -1, 
       -1, 
       -1, 
       -1, 
       -1, 
       0 
      ], 
      [ 
       'myshow.s01e03.hdtv.x264-asap.nfo', 
       4798, 
       4798, 
       2, 
       734, 
       1, 
       $VAR1->[1][1][6], 
       -1, 
       -1, 
       -1, 
       -1, 
       -1, 
       0 
      ] 
      ] 
     ]; 

我想打印出清单:

myshow.S01E03.HDTV.x264-ASAP.mp4 
Downloaded.txt 
myshow.s01e03.hdtv.x264-asap.nfo 

并同时获得“FE93DEC4505772CE9CFCE353A1F07027A165032F”到字符串变量。 我很难搞清楚什么可以做到这一点。

我的代码高达这一点:

my $response = $ua->get($url, @ns_headers); 
my $content = from_json $response->decoded_content; 
my @files=$content->{files}; 
print Dumper(@files); 
+4

解析表示从数据格式转换为内存数据结构。你已经成功解析它。你似乎缺乏关于如何处理数组和引用的知识。你有尝试过什么吗? http://perldoc.perl.org/perldata.html和http://perldoc.perl.org/perlref.html是一个很好的出发点。 – Quentin

+0

我不知道这是否一定是公平的 - 一个简单的数组数组并不难解析,但事实并非如此。它是一个包含一些数组引用的数组,有些不是,这比基本情况要复杂得多。 – Sobrique

+1

这与您[上一个问题]中的数据不同(http://stackoverflow.com/questions/31492440/parsing-this-kind-of-data)。你使用不同的API? – Borodin

回答

3

[]表示在Perl的阵列。这是一个3深的阵列。所以你需要迭代它,提取值。

foreach my $element (@files) { 
    if (ref $element eq "ARRAY") { 
     foreach my $subelement (@$element) { 
      print $subelement->[0],"\n"; 
     } 
    } 
    else { 
     print $element,"\n"; 
    } 

} 

该过程是复杂的一点通过是数组的数组 - 它实际上是相当混乱的数据结构。所以你需要使用像ref这样的东西来告诉你现在是看数组还是文本元素。

这里要知道的一个有用的技巧是 - 如果你有一个数组,你可以通过$array[0]访问一个值。如果你有一个数组引用,你可以使用->,它首先解引用数组。

E.g.

my @array = qw (fish); 
my $ref_to_array = \@array; 
print $ref_to_array,"\n"; 
print $ref_to_array -> [0],"\n"; 
+1

感谢您使用实际的代码进行解释!我不熟悉这种嵌套结构。 – Droidzone

+0

我不得不再深入一层才能获取数据。我向代码提交了一个编辑。 – Droidzone

+1

@Droidzone Sobrique的代码适用于您在问题中发布的数据,因此您提出的修改并不合理。如果答案中的代码与问题中的数据不一致,未来访问此帖的访问者可能会感到困惑。 – ThisSuitIsBlackNot