http://qs321.pair.com?node_id=845408


in reply to substr question

I modified your problem definition into:

How to split a string into several substrings (of a given maximum length) without breaking a word when splitting.

I found this (quickly hacked) solution:

#! /opt/perl/bin/perl use strict; use warnings; my $text = "Hello, I am a perl/mysql programmer, but am self taught so + I do not know all the awesome features Perl has, however, I am ok at + it though, I guess."; sub split_at { my ( $text, $len ) = @_; my @result; my @parts = split /[ ]/, $text; my $short = shift @parts; while ( @parts ) { if ( length($short) + length($parts[0]) < $len ) { $short = join( ' ', $short, shift @parts ); } else { push @result, $short; $short = shift @parts; } } push @result, $short; return @result; } { local $, = local $\ = $/; print split_at( $text, 100 ); # beware print split_at( 'a'x110, 100 ); }

Limitation: If the given string doesn't contain any whitespace (\x20), it won't split at all.

If you just want/need the first substring, just use the first returned element.

Updates:

  • cleaned up code
  • fixed comparison; thanks, rowdog