#! perl -slw use strict; use Data::Dump qw[ pp ]; ## Generate some data my $string = '1234567890' x 7; my @bits = map[ int rand length $string, 2 + int rand 10 ], 1 .. 20; ## Sort ascending offset/descending length @bits = sort{ $a->[ 0 ] <=> $b->[ 0 ] || $b->[ 1 ] <=> $a->[ 1 ] } @bits; ## build groups my @groups; ## Till done while( @bits ) { ## start a new group with the last bit push @groups, [ pop @bits ]; ## Scan the rest of the bits (backward so we can splice without bad kharma) for my $bit ( reverse 0 .. $#bits ) { ## if it'll fit in this line if( $bits[ $bit ][ 0 ]+ $bits[ $bit ][ 1 ] < $groups[-1][-1][0] ) { ## add it push @{ $groups[-1] }, splice @bits, $bit, 1; } } } ## display the results print $string; for my $group ( @groups ){ my $line = ' ' x 70; for my $bit ( @{ $group } ) { substr $line, $bit->[ 0 ], $bit->[ 1 ], substr $string, $bit->[ 0 ], $bit->[ 1 ]; } print $line; } __END__ c:\test>700817.pl 1234567890123456789012345678901234567890123456789012345678901234567890 23 89 4567890 567890123 9012 567890123 012 0 234567890 56789012345 901234567 45678 123456789 45678 3456789012 890123 90123456 3456789 234 90123456 c:\test>700817.pl 1234567890123456789012345678901234567890123456789012345678901234567890 2345 890123 6789012 5678 234567 012345 2345 90 5678901234 789012345 12345 67890123 01234 90 45678901 6789 234567890 34567 0123456789 9012345 c:\test>700817.pl 1234567890123456789012345678901234567890123456789012345678901234567890 1234567 34567 234567890 9012 0 345678901 5678901 6789012 89012 567890 23456789012 567890 234567890 4567890123 789012345 0123456789 5678901234 45678901234 89012345 56789012345 c:\test>700817.pl 1234567890123456789012345678901234567890123456789012345678901234567890 123456 90 56789012 56789 567 234567 1234 234567890 67 123456789 23456 345678901 01234 678901234 1234 890 890123456 89012 678901234 45678901