Php perl反序列化长度计数中的json不起作用

Php perl反序列化长度计数中的json不起作用,php,json,perl,Php,Json,Perl,如何遍历反序列化的json字符串?我现在不能得到正确的数值,它不正确 my $list = request("http://localhost/getjson.php"); my $deserialize = from_json( $list ); print Dumper($deserialize); $VAR1 = [ 'ab', 'cc', 'de',

如何遍历反序列化的json字符串?我现在不能得到正确的数值,它不正确

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

您返回的是数组引用,而不是数组。您需要取消对该值的引用

my @array = @$deserialize; # or @{ $deserialize }
print scalar @array;
此外,如果您想在数组上迭代,您可以使用


您返回的是数组引用,而不是数组。您需要取消对该值的引用

my @array = @$deserialize; # or @{ $deserialize }
print scalar @array;
此外,如果您想在数组上迭代,您可以使用

发件人:

不能使用长度来确定数组的大小。要做到这一点,请使用上述建议

您的bug给了您一个错误的值,因为您使用的是数组引用的长度,在字符串上下文中类似于ARRAY0x22d0a88,在您的例子中,它似乎有13个字符长。例如,相当于:

print length "ARRAY(0x22d0a88)";
奇怪的是,如果你愿意的话length@array,它将实际返回数组长度的长度。例如,大小为16的数组将返回2,因为字符串16有两个字符长。

来自:

不能使用长度来确定数组的大小。要做到这一点,请使用上述建议

您的bug给了您一个错误的值,因为您使用的是数组引用的长度,在字符串上下文中类似于ARRAY0x22d0a88,在您的例子中,它似乎有13个字符长。例如,相当于:

print length "ARRAY(0x22d0a88)";

奇怪的是,如果你愿意的话length@array,它将实际返回数组长度的长度。例如,大小为16的数组将返回2,因为字符串16有两个字符长。

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

因此,您需要取消引用已有的变量:$反序列化

此外,您并不真正想使用length函数。如果打印数组的整数值或标量值,它将返回其大小

这就是你想要的:

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

您实际上是在参照结果工作。由于JSON可以包含各种不同的结果,decode_JSON不会专门返回列表

因此,您需要取消引用已有的变量:$反序列化

此外,您并不真正想使用length函数。如果打印数组的整数值或标量值,它将返回其大小

这就是你想要的:

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

是您在反序列化时忘记了$sigil,还是您的实际代码中忘记了$sigil?抱歉,是您在反序列化时忘记了$sigil,还是您的实际代码中忘记了$sigil?抱歉,是您在反序列化时忘记了$sigil。int@array不会做你认为它会做的事。获取数组大小的惯用方法是scalar@array。int之所以有效,是因为它将数组放在标量上下文中,因此您正在执行例如int16的操作,它当然返回16的整数部分。有趣的是,我一直知道标量是更好的方法,但我总是更喜欢轻松地键入int。从现在起,我将以正确的方式开始。有很多方法可以强制使用标量上下文。例如:my$size=@array。您可能还想知道,当解引用中没有歧义时,不需要花括号:@$aref相当于@{$aref}。更漂亮,更容易打字。int@array不会做你认为它会做的事。获取数组大小的惯用方法是scalar@array。int之所以有效,是因为它将数组放在标量上下文中,因此您正在执行例如int16的操作,它当然返回16的整数部分。有趣的是,我一直知道标量是更好的方法,但我总是更喜欢轻松地键入int。从现在起,我将以正确的方式开始。有很多方法可以强制使用标量上下文。例如:my$size=@array。您可能还想知道,当解引用中没有歧义时,不需要花括号:@$aref相当于@{$aref}。更漂亮,更容易打字。