my $width = 8; my $break_at = 4; my $orig = "#" x $width; (my $broken = $orig) =~ s/(\S{$break_at})(?!\z)/$1 /g; print qq{'$orig'\n}, qq{'$broken'\n}; #### '########' '#### ####' #### my $broken = join( q{ }, grep { $_ ne q{} } split( qr/(\S{$broken_at})/, $orig ) ); #### my $broken = $orig; for my $chunk ( 1 .. length($broken) / $break_at ) { substr( $broken, $break_at * $chunk + $chunk - 1, 0 , $break_at * $chunk + $chunk - 1 == length($broken) ? q{} : q{ } ); }