sub _nsc { my( $x, @a ) = @{$_[0]}; my( $y, @b ) = @{$_[1]}; @a && @b ? ( $x =~ /\d/ ? ( $y =~ /\d/ ? $x <=> $y || _nsc(\@a,\@b) : -1 ) : ( $y =~ /\d/ ? 1 : lc($x) cmp lc($y) || _nsc(\@a,\@b) )) : ( @a ? 1 : @b ? -1 : 0 ) } sub natsort { map join('',@$_), sort {_nsc($a,$b)} map [/(\d+|\D+)/g], @_ }