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

Replies are listed 'Best First'.
Re^2: substr question
by rowdog (Curate) on Jun 18, 2010 at 21:20 UTC
    if ( length($short) + length($parts[0]) <= $len ) { $short = join( ' ', $short, shift @parts ); }

    The length is off by one because you add not only the part, but a new space as well. The easy fix is to delete the = from <= $len