1

次のようなネストされたハッシュテーブルがあります。

{"a": {"b": {"c": {"d": "", "e": ""},
             "m": ""},
       "f": ""},
 "h": {"i": {"j": "", "k": ""}
      }
}

そして、私はそれを次のような形式に変換したいと思います:

[
    {"title": "a", "isFolder": true,
        "children": [
            {"title": "b", "isFolder": true",
                "children": [
                    {"title": "c", "isFolder": true",
                        "children": [
                            {"title": "d"},
                            {"title": "e"}
                        ]
                    },
                    {"title": "m"}
                ]
            },
            {"title": "f"},
            {"title": "g"}
        ]
    },
    {"title": "h", "isFolder": "true",
        "children": [
            {"title": "i", "isFolder": "true",
                "children": [
                    {"title": "j"},
                    {"title": "k"}
                ]
            }
        ]
    }
]

だから私はプログラムを書きました:

#!/usr/bin/perl

use JSON;

$json = JSON->new->allow_nonref;

$struct = [];
sub convertRaw() {
    ($raw, $ts) = @_;

    foreach (keys %$raw) {
        if ($raw->{$_}) {
            push @$ts, {"title" => $_, "isFolder" => "true", "children" => []};
            &convertRaw($raw->{$_}, @$ts[-1]->{"children"});
        }
        else {
            push @$ts, {"title" => $_};
        }
    }
}

$raw_struct = {"a"=> {"b"=> {"c"=> {"d"=> "", "e"=> ""},
                             "m"=> ""},
                      "f"=> ""},
               "h"=> {"i"=> {"j"=> "", "k"=> ""}
                     }
              };

&convertRaw($raw_struct, $struct);

print $json->pretty->encode($struct)."\n";

ただし、出力は次のようになりました。

[
   {
      "isFolder" : "true",
      "children" : [
         {
            "isFolder" : "true",
            "children" : [
               {
                  "title" : "k"
               },
               {
                  "title" : "j"
               },
               {
                  "title" : "a"
               }
            ],
            "title" : "i"
         }
      ],
      "title" : "h"
   }
]

本当に混乱しています。ここで何が問題なのか理解できますか?

4

1 に答える 1

1

グローバルに宣言された変数$raw$ts。したがって、子要素の処理中のハッシュの更新は、親要素の将来の処理に影響します。それらを字句スコープの変数として宣言します

sub convertRaw {
    my ($raw, $ts) = @_;
    # the rest of the code
于 2013-03-27T06:11:40.537 に答える