use warnings; use strict; use Data::Dumper qw(Dumper); my @clk = ('ux_prim_clk', 'ux_side_clk', 'ux_xtal_frm_refclk'); #my @clk_output = map [ split /_/, $_ ], @clk; # Just as a note: Performance is the same with explict loop. # Every map statement can be expressed as a foreach() loop. # This is the same your previous statement - nothing wrong with it # just demo'ing what the map actually does... my @clk_output; foreach my $clk_line (@clk) { push @clk_output, [split "_",$clk_line]; } print Dumper \@clk_output; my @clk_new; foreach my $row_ref (@clk_output) { push @clk_new, join ("_",@$row_ref); } print Dumper \@clk_new; __END__ $VAR1 = [ [ 'ux', 'prim', 'clk' ], [ 'ux', 'side', 'clk' ], [ 'ux', 'xtal', 'frm', 'refclk' ] ]; $VAR1 = 'ux_prim_clk'; $VAR2 = 'ux_side_clk'; $VAR3 = 'ux_xtal_frm_refclk'; #### use warnings; use strict; use Data::Dumper qw(Dumper); my @clk = ('ux_prim_clk', 'ux_side_clk', 'ux_xtal_frm_refclk'); my @clk_output = map [ split /_/, $_ ], @clk; print Dumper \@clk_output; my @clk_new = map{my $line =join ("_", @$_); $line}@clk_output; print Dumper \@clk_new;