Display based on __DATA__ SNO A B C D num: 1011 X X X X num: 0001 X X X X num: 0011 X X X X num: 0201 X X X X num: num: ... #### use strict; use Data::Dumper; my @display = (); # AoA while () { build_display($_); } print " SNO A B C D\n"; for (@display) { print 'num: ' . join(' ', @$_) . "\n"; } print "\n"; ########################## sub build_display { ########################## my $serialno = shift; chomp $serialno; if ($serialno) { my ($prefix,$number) = ($serialno =~ /^(\w)(\w{4})/); my $j = ($prefix =~ /A/i) ? 1 : ($prefix =~ /B/i) ? 2 : ($prefix =~ /C/i) ? 3 : ($prefix =~ /D/i) ? 4 : 0; my $temp = ''; for (0..$#display) { if ($display[$_][0] =~ /^$number$/i) { ## Need to update array_ref $temp = $display[$_]; ## copy to temp splice(@display, $_, 1); ## delete from array. Added to top later. print "After Delete: " . Dumper(\@display); ; } } ## ?? Adds an element to the @display array if update is required. But why OR how ?? print "Before Add: " . Dumper(\@display); ; ## if 'number' not in array, create a new entry. $temp = [$number,' ',' ',' ',' '] if (!$temp); $temp->[$j] = 'X'; ## flag the applicable prefix unshift @display, $temp; ## add to top of array. } } __DATA__ A0011 B0001 C0201 D0001 A1011 B0201 C1011 D0201 A0201 B0011 C0011 D0011 A0001 B1011 C0001 D1011