use strict; use warnings; my $max = 5; my $str = '123456789012'; $str =~ s/(\S\S{$max,})/mySplit($1)/eg; print $str; sub mySplit { my $s = $_[0]; my ($n, $i, @p, @r); ### Calculate number of pieces $n = ceil (length($s) / $max); ### Calculate length of pieces for ($i = 0; $i < length $s; $i++) { $p[$i % $n]++; } ### Get pieces for (@p) { $s =~ s/(.{$_})//; push @r, $1; } return join ' ', @r; } sub ceil { return $_[0] == int $_[0] ? $_[0] : int ($_[0] + 1); }