#!/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;