2012-02-21 75 views
1

如何遍历反序列化的json字符串?我现在无法获得正确数量的值,因此无法正确计数。json in perl反序列化长度计数不起作用

my $list = request("http://localhost/getjson.php");        
my $deserialize = from_json($list); 
print Dumper($deserialize); 
$VAR1 = [ 
      'ab', 
      'cc', 
      'de', 
      'aer', 
      'ffe', 
      'cer', 
      'dad', 
      'efef', 
      'afaf', 
      'ege', 
      'grsc', 
      'cegg', 
      'cegg',   
      'cegg/aaa.html', 
      'eggt', 
      'ttt' 
     ]; 
print length($deserialize); 
13 ?? it should say 16 
+0

难道你忘了上'deserialize'的'$'印记错字,或者是在你的实际代码? – TLP 2012-02-21 01:07:13

+0

还不好意思打错了。 – user391986 2012-02-21 01:14:37

回答

5

您正在取回数组引用而不是数组。您需要取消引用该值。

my @array = @$deserialize; # or @{ $deserialize } 
print scalar @array; 

而且,如果你想迭代这个数组,你可以只使用for

for (@$deserialize) { 
    # do stuff 
1

perldoc -f length

This function cannot be used on an entire array or hash to find 
out how many elements these have. For that, use "scalar 
@array" and "scalar keys %hash", respectively. 

不能使用length找出的大小阵列。要做到这一点,请使用上面的建议。

你的错误给你一个错误的值,因为你正在采取数组引用的长度,在字符串上下文将类似ARRAY(0x22d0a88),在你的情况下,它似乎是13个字符长。例如。相当于:

print length "ARRAY(0x22d0a88)"; 

作为一个好奇侧面说明,如果你会做length(@array),它实际上将返回数组的长度的长度。例如。一个大小为16的数组将返回2,因为字符串"16"是两个字符长。

1

您实际上正在参考结果。由于JSON可以包含各种不同的结果,decode_json不会专门返回一个列表。

所以你需要解引用,你有变量:$反序列化

此外,你真的不希望被使用长度的功能。如果您打印数组的整数值(或标量值),它将返回它的大小。

因此,这里是你想要什么:

my $list = request("http://localhost/getjson.php");        
my $deserialize = from_json($list); 
print scalar (@{$deserialize}); 

,将打印的数组的大小。

如果你想只用一个数组,你可以做的工作开始:

my $list = request("http://localhost/getjson.php");        
my $deserialize = from_json($list); 
my @json_array = @{$deserialize}); 
print scalar (@json_array); 
+0

int(@array)'不会做你认为它做的事情。获得数组大小的惯用方法是'scalar @ array'。 'int'可以工作,因为它将数组置于标量上下文中,所以你在做例如'int(16)',当然返回整数部分16. – TLP 2012-02-21 01:11:58

+0

有趣的是,我总是知道标量是更好的方法,但我总是喜欢简单的输入“int”。我将从现在开始以适当的方式开始。 – GoldenNewby 2012-02-21 01:14:57

+0

有很多方法来强加标量上下文。例如:'my $ size = @ array'。 – TLP 2012-02-21 01:17:55