#!/tmp/bleadperl/bin/perl -w
use re 'eval';
my $re;
my $len = 20;
$_ = "this is a long string, and I want to insert newlines every 20 chars";
$re = qr{
(??{ '\b\w{1,' . ($len - ($+[0] - $-[0])) . '}\b' })
(?(?{ ($+[0] - $-[0]) < $len })
(??{ '\W{0,' . ($len - ($+[0] - $-[0])) . '}' })
(?(?{ ($+[0] - $-[0]) < $len })
(?(?=
(??{ '\b\w{1,' . ($len - ($+[0] - $-[0])) . '}\b' }))
(??{ $re })
)
)
)
}x;
s{($re)}{$1\n}xg;
print;
####
$re = qr{
(??{ '\b\w{1,' . ($len - ($+[0] - $-[0])) . '}\b' })
(?(?{ ($+[0] - $-[0]) < $len })
(??{ '\W{0,' . ($len - ($+[0] - $-[0])) . '}' })
)
(?(?{ ($+[0] - $-[0]) == $len })
(?&done)
)
}x;
s{($re+)(?%done)}{$1\n}xg;
####
$re = qr{
(??{ '\b\w{1,' . ($len - ($+[0] - $-[0])) . '}\b' })
(?(?{ ($+[0] - $-[0]) < $len })
(??{ '\W{0,' . ($len - ($+[0] - $-[0])) . '}' })
)
(?(?{ ($+[0] - $-[0]) == $len }) (?;) )
}x;
s{($re+)}{$1\n}xg;
####
while (1)
do_pattern($re);
if ($seen_qu_semi) { last }
}
####
$re = qr{
(??{ '\b\w{1,' . ($len - ($+[0] - $-[0])) . '}\b' })
(?(?{ ($+[0] - $-[0]) < $len })
(??{ '\W{0,' . ($len - ($+[0] - $-[0])) . '}' })
)
}x;
s{
(
(?:
(?(?{ ($+[0] - $-[0]) == $len })(?!))
$re
)+
)
}{$1\n}xg;