Удаление значений листьев в Data :: TreeDumper - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь научиться работать с модулем Data::TreeDumper. У меня есть хеш, который выглядит следующим образом:

my $h = {'file1' => 1,
         'file2' => { 
                      'file3' => 3,
                      'file4' => 4
                    },
         'file5' => 5
};

Я использую Data::TreeDumper следующим образом:

print DumpTree($h,'Contents of $h');

И вывод:

Contents of $d
|- file1 = 1
|- file2
|  |- file3 = 3
|  `- file4 = 4
`- file5 = 5

Это прекрасно работает, но я бы хотел как-то удалить значения листьев хеша, что означает вывод:

Contents of $d
|- file1 
|- file2
|  |- file3
|  `- file4
`- file5

После прочтения документов (ссылка) Я обнаружил, что могу передать фильтр, который будет вносить изменения в вывод. Но они не показали, как это сделать. Кроме того, я думаю, что этого можно добиться с помощью модуля Tree::Simple, но я предпочитаю этого не делать. Если не существует переменной, которую я могу установить, чтобы получить желаемый результат, то могу ли я сделать это с помощью специального фильтра? если да, то как?

1 Ответ

0 голосов
/ 15 января 2019

Фильтры могут изменять метки, но вы хотите изменить значения.

Итак, я сделал глубокую копию хэша и заменил значения non-ref пустыми хешами (пустые массивы тоже сработали бы) и установил NO_NO_ELEMENTS, чтобы они не выводились для них. Мне также пришлось отключить адреса (может быть, вы установили соответствующий флаг где-нибудь еще?)

#! /usr/bin/perl
use warnings;
use strict;

use Data::TreeDumper;
use Storable qw{ dclone };

sub remove_leaves {
    my $h = $_[0];
    for (values %$h) {
        if (ref) {
            remove_leaves($_);
        } else {
            $_ = {};
        }
    }
}

my $h = {file1 => 1,
         file2 => {file3 => 3,
                   file4 => 4},
         file5 => 5};

my $clone = dclone($h);

remove_leaves($clone);
print DumpTree($clone, 'Contents of $h',
               NO_NO_ELEMENTS  => 1,
               DISPLAY_ADDRESS => 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...