2012-02-21 70 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