【问题标题】:json in perl deserialization length count doesn't workperl反序列化长度计数中的json不起作用
【发布时间】:2012-03-11 08:34:36
【问题描述】:

如何遍历一个反序列化的 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

【问题讨论】:

  • 您忘记了deserialize 上的$ 标志是错字,还是在您的实际代码中?
  • 抱歉,错字已修复。

标签: php json perl


【解决方案1】:

你得到的是一个数组引用而不是一个数组。您需要取消引用该值。

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

此外,如果您想遍历数组,您可以使用 for

for (@$deserialize) { 
    # do stuff 

【讨论】:

    【解决方案2】:

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

    所以你需要取消引用你拥有的变量:$deserialize

    此外,您并不想使用长度函数。如果你打印一个数组的整数值(或标量值),它将返回它的大小。

    这就是你想要的:

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

    【讨论】:

    • int(@array) 不会像您认为的那样做。获取数组大小的惯用方法是scalar @arrayint 之所以有效,是因为它将数组置于标量上下文中,因此您正在做例如int(16),当然返回 16 的整数部分。
    • 有趣,我一直知道标量是更好的方法,但我总是更喜欢键入“int”的便利性。从现在开始,我会以正确的方式开始。
    • 有很多方法可以施加标量上下文。例如:my $size = @array.
    • 您可能还想知道在取消引用中没有歧义时不需要大括号:@$aref 等效于 @{$aref}。而且更漂亮,更容易打字。
    【解决方案3】:

    来自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" 有两个字符长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-30
      • 2023-04-06
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2020-03-10
      • 2015-09-28
      • 1970-01-01
      相关资源
      最近更新 更多