Search code examples
perlperl-data-structurestemplate-toolkit

List of paths into hash array tree in Perl


I got an array of paths

C:\A
C:\B\C
D:\AB

and I'd like to have these in a hash array tree so I can go through them in a TT2 template.

What I mean is like this:

@dirs = [
          {
            name => "C:",
            subs => [
                      {
                        name => "A",
                        subs => [],
                      },
                      {
                        name => "B",
                        subs => [
                                  {
                                    name => "C",
                                    subs => [],
                                  }
                                ],
                      }
                    ]
          },
          { 
            name => "D:",
            subs => [
                      {
                        name => "AB",
                        subs => [],
                      }
                    ],
          }
        ]

I also know that I'm probably doing brainderp here so I'm open to other approaches, only requirement is turning that list of paths into something you can rebuild as a tree with the TT2 Template Toolkit.

Also what's that structure called? I just thought of hash array tree but I bet that's wrong.


Solution

  • I did one with a complex hash structure keeping track of already placed nodes, and then I did this one. More steps, but somewhat leaner code.

    while ( <> ) {
        chomp;
        my $ref = \@dirs;
        foreach my $dir ( split /\\/ ) {
            my $i = 0;
            $i++ while ( $ref->[$i] and $ref->[$i]{name} ne $dir );
            my $r = $ref->[$i] ||= { name => $dir, subs => [] };
            $ref  = $r->{subs};
        }
    }