1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #!/usr/bin/perl
use strict;
use warnings;
use feature qw(:5.14);
use Data::Dumper;
$Data::Dumper::Sortkeys++;
my $sommaire = {
'1*' => { '1-a' => undef, '1-b' => undef, },
'2' => { '2-a*' => undef, '2-b' => { '2-b-A' => undef, '2-b-B' => undef, '2-b-C' => undef }, },
'3*' => { '3-a' => undef, '3-b' => undef, },
'4' => { '4-a' => undef, '4-b' => undef, },
};
say Data::Dumper->Dump([$sommaire], [qw($sommaire)]);
sub update_level($;@);
sub update_level($;@) {
my ($s, @changes) = @_;
my $new_s = { };
return undef if !defined $s;
my @level;
foreach my $num (sort keys %$s) {
my $sub_level = $s->{$num};
foreach my $change (@changes) {
my ($old, $new) = @$change;
$num =~ s/^$old/$new/;
}
my $to_remove = $num =~ s/\*$//;
push @level, $num;
if ($to_remove) {
$new_s->{"0-$num"} = update_level($sub_level, @changes, [ $num, "0-$num" ]);
}
else {
my $current_num = shift @level;
$new_s->{$current_num} = update_level($sub_level, @changes, [ $num, $current_num ]);
}
}
return $new_s;
}
my $new_sommaire = update_level($sommaire);
say Data::Dumper->Dump([$new_sommaire], [qw(*new_sommaire)]); |
Partager