Использование Tree::DAG_Node для печати кучи списка в древовидном формате

Чтобы упростить задачу, я пытаюсь заставить эту кучу печатать в древовидном формате. Это близко, но я знаю, что мне чего-то не хватает, но я просто не могу понять этот модуль. Я знаю, что есть tree::simple, и я думаю, что просто Tree? Но я не могу найти никаких руководств о том, как на самом деле использовать список или массив. Сортировка кучей правильная, потому что она сортирует список после того, как дерево было опубликовано, но я не могу понять, как правильно нарисовать дерево, и опять же, вывод никогда не был моей сильной стороной ни на одном языке. Я думаю, что это не захват данных из файла? по крайней мере, это моя идея, но я недостаточно уверен, чтобы быть уверенным. вот мой код до сих пор.

#!/usr/bin/perl

use 5.006;
use strict;
use warnings;
use Tree::DAG_Node;

process_data(read_file('data.txt'));
process_data((3,1,4,1,5,9,2,6,5,3,6));

sub read_file{
    my($filename)=@_;
    my @data=();
    my @words;
    open(my $fh, "<", $filename)
        or die "Could not open file: $!\n";
    while(<$fh>){
        chomp;
        @words = split(' ');
        foreach my $word(@words) {
            push @data, $word;
        }
    }
    close $fh;
    return @data;
}


sub heap_sort {
    my ($a) = @_;
    my $n = @$a;
    for (my $i = ($n - 2) / 2; $i >= 0; $i--) {
        down_heap($a, $n, $i);
    }
    for (my $i = 0; $i < $n; $i++) {
        my $t = $a->[$n - $i - 1];
        $a->[$n - $i - 1] = $a->[0];
        $a->[0] = $t;
        down_heap($a, $n - $i - 1, 0);
    }
}

sub down_heap {
    my ($a, $n, $i) = @_;
    while (1) {
        my $j = max($a, $n, $i, 2 * $i + 1, 2 * $i + 2);
        last if $j == $i;
        my $t = $a->[$i];
        $a->[$i] = $a->[$j];
        $a->[$j] = $t;
        $i = $j;
    }

    sub max {
        my ($a, $n, $i, $j, $k) = @_;
        my $m = $i;
        $m = $j if $j < $n && $a->[$j] > $a->[$m];
        $m = $k if $k < $n && $a->[$k] > $a->[$m];
        return $m;
    }
}

sub draw_tree{
    my(@data)=@_;
    my $root = Tree::DAG_Node->new;
    $root->name($_[0]);
    $root->new_daughter->name($_) for ('1'..'10');
    my @names = @data;
    my $count =0;
    for my $n ($root->daughters) {
        for (split //, $names[$count++]) {
            $n->new_daughter->name($_)
        }
    }
    print map "$_\n", @{$root->draw_ascii_tree};
}

sub process_data{
    my(@data)=@_;
    my @a = @data;
    print "@a\n";
    print "\n";
    heap_sort(\@a);
    print "\n";
    print "@a\n";
    print "\n";
    draw_tree(@a);
} 

и вот результат, который я получаю до сих пор.

10,4,5,2,1,7

Use of uninitialized value in split at HEAPSORTtree.pl line 77.
Use of uninitialized value in split at HEAPSORTtree.pl line 77.
Use of uninitialized value in split at HEAPSORTtree.pl line 77.
Use of uninitialized value in split at HEAPSORTtree.pl line 77.
Use of uninitialized value in split at HEAPSORTtree.pl line 77.
Use of uninitialized value in split at HEAPSORTtree.pl line 77.
Use of uninitialized value in split at HEAPSORTtree.pl line 77.
Use of uninitialized value in split at HEAPSORTtree.pl line 77.
Use of uninitialized value in split at HEAPSORTtree.pl line 77.
                                                       |

                                                 <10,4,5,2,1,7>

                                     /---------------------------------------+--
-+---+---+---+---+---+---+---\
                                     |                                       |
 |   |   |   |   |   |   |   |
                                    <1>                                     <2>
<3> <4> <5> <6> <7> <8> <9> <10>
 /-----------------+-----------------+---+---+---+---+---+---+---+---+---\

 |                 |                 |   |   |   |   |   |   |   |   |   |

<1> <Tree::DAG_Node=HASH(0x4b32dc)> <,> <4> <,> <5> <,> <2> <,> <1> <,> <7>


10,4,5,2,1,7

3 1 4 1 5 9 2 6 5 3 6

                   |
                  <1>
 /---+---+---+---+---+---+---+---+---\
 |   |   |   |   |   |   |   |   |   |
<1> <2> <3> <4> <5> <6> <7> <8> <9> <10>
 |   |   |   |   |   |   |   |   |   |
<1> <1> <2> <3> <3> <4> <5> <5> <6> <9>

1 1 2 3 3 4 5 5 6 9 6

Press any key to continue . . .

результат, который я хочу, похож на этот

|               
            <root>             
     /-------+-------+-------\ 
     |       |       |       | 
    <1>     <d>     <e>     <f>
 /---+---\           |         
 |   |   |          <3>        
<a> <b> <c>      /---+---\     
                 |   |   |     
                <g> <h> <i>   

person Dom    schedule 30.04.2018    source источник
comment
Каково содержание data.txt?   -  person Håkon Hægland    schedule 30.04.2018
comment
Содержимое data.txt: 10,4,5,2,1,7.   -  person Dom    schedule 30.04.2018
comment
Обратите внимание, что вложенная подпрограмма max() не является частной для down_heap(), см. Вложенные подпрограммы и область видимости в Perl для получения дополнительной информации. Однако лексические подпрограммы доступны, начиная с Perl версии 5.18, см. perdoc perlsub.   -  person Håkon Hægland    schedule 30.04.2018
comment
ой! Боже мой, извините, max() не должен был быть с таким отступом, я просто посмотрел на него по сравнению с кодом, который у меня был.   -  person Dom    schedule 30.04.2018
comment
И я ошибся в содержании data.txt. это 10 4 5 2 1 7   -  person Dom    schedule 30.04.2018
comment
И должен ли я его вкладывать? Сортировка кучей работает (поскольку она сортирует почти все, что я ей бросаю), но я не получаю правильный вывод с этим модулем.   -  person Dom    schedule 30.04.2018
comment
Привет @Дом. Нет необходимости вкладывать подпрограмму max(). Интересно, какова цель этой строки: $root->new_daughter->name($_) for ('1'..'10')? Почему вы добавляете 10 дочерних узлов?   -  person Håkon Hægland    schedule 30.04.2018
comment
Привет, @HåkonHægland. Я вставил это в качестве наполнителя, когда писал, так как когда я пытался сослаться на что-то еще, он не принимал это как что-то для отображения.   -  person Dom    schedule 30.04.2018
comment
@HåkonHægland Я еще немного возился с этим модулем, и мне удалось заставить его отображать определенные числа в зависимости от их зелья в списке. Я думаю, мне просто нужно закодировать способ сравнения узлов, а также поменять их местами, а также сравнить новые вставки с тем, что уже есть в дереве.   -  person Dom    schedule 01.05.2018