use strict; use warnings; printf qq{%20s\n}, comma3($_) for (12, 1234, 1234567, 1234567890); sub comma3 { my $ct = 0; join q{}, reverse map {++ $ct % 3 ? $_ : ($_, q{,})} reverse split m{}, $_[0]; } #### 12 1,234 1,234,567 1,234,567,890 #### sub comma3 { my $ct = 0; my $len = length $_[0]; return join q{}, reverse map { ++ $ct % 3 ? $_ : $ct == $len ? $_ : ($_, q{,}) } reverse split m{}, $_[0]; }