use strict; use warnings; use feature 'say'; my %data; for (0..14) { my ($lpn, $ppn, $cnt_subppn) = get_ns(); push @{ $data{$lpn}{$ppn} }, (0..$cnt_subppn); } for my $lpn ( sort {$a <=> $b} keys %data ) { say "$lpn:"; for my $ppn ( sort {$a <=> $b} keys %{ $data{$lpn} } ) { say " $ppn:"; for my $sub_ppn ( sort {$a <=> $b} @{ $data{$lpn}{$ppn} } ) { say " $sub_ppn"; } } } sub get_ns { return (int(rand(10)), int(rand(10)), int(rand(10))); }