#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11136806 use warnings; my %hash; while( ) { chomp; my $code = s/\@/}{/gr; eval "\$hash{$code}++"; } #use Data::Dump 'dd'; dd \%hash; sub nest { my $h = shift; my $answer = ''; if( ref $h ) { for my $k ( sort keys %$h ) { $answer .= ref( $h->{$k} ) ? "$k {\n" . nest( $h->{$k} ) =~ s/^/\t/gmr . "}\n" : $k . "\n"; } } $answer; } local $_ = nest \%hash; s/\w\K\n\s*(?=\w)/,/g; print; __DATA__ instreg@d1@d1 instreg@d1@d2 instreg@d2@d1 instreg@d3@d1 instreg@d4@d1 instreg@d5@d1 instreg@d6@d1 instreg@d7@d1 instreg@d8@d1 alureg@d1@d1 alureg@d2@d1 alureg@d3@d1 alureg@d4@d1 alureg@d5@d1 alureg@d6@d1 alureg@d7@d1 alureg@d8@d1 pgmctr@d1@d1 pgmctr@d2@d1 pgmctr@d3@d1 pgmctr@d4@d1 pgmctr@d5@d1 pgmctr@m1 pgmctr@m2 pgmctr@m3 pgmctr@m4 pgmctr@m5 #### alureg { d1 { d1 } d2 { d1 } d3 { d1 } d4 { d1 } d5 { d1 } d6 { d1 } d7 { d1 } d8 { d1 } } instreg { d1 { d1,d2 } d2 { d1 } d3 { d1 } d4 { d1 } d5 { d1 } d6 { d1 } d7 { d1 } d8 { d1 } } pgmctr { d1 { d1 } d2 { d1 } d3 { d1 } d4 { d1 } d5 { d1 } m1,m2,m3,m4,m5 }