use strict; my @aa = qw/1245 1248 0000 1246 1247/; my @c; my %bb; my $cnt = -1; foreach my $tim (@aa) { ++$cnt; $bb{$cnt}{'time'} = $tim; if ($tim == 0000) { for my $next_non_zero ($cnt + 1 .. scalar (@aa) -1) { next if ($aa[$next_non_zero] == 0000); $bb{$cnt}{'order'} = $aa[$next_non_zero]; last; } if (! $bb{$cnt}{'order'}) { for my $last_non_zero (reverse 0 .. $cnt - 1) { next if ($aa[$last_non_zero] == 0000); $bb{$cnt}{'order'} = $aa[$last_non_zero]; last; } } if (! $bb{$cnt}{'order'}) { $bb{$cnt}{'order'} = 0000; } } else { $bb{$cnt}{'order'} = $tim; } } foreach my $key ( sort { $bb{$a}{'order'} <=> $bb{$b}{'order'} || $bb{$a}{'time'} <=> $bb{$b}{'time'} } keys %bb ) { push @c, $bb{$key}{'time'}; } print "@aa\n"; print "@c\n"; __DATA__ 1245 1248 0000 1246 1247 __OUTPUT__ 1245 0000 1246 1247 1248 or __DATA__ 1245 1248 0000 1246 1247 0000 __OUTPUT__ 1245 0000 1246 0000 1247 1248