Adriano Rodrigues Ferreira wrote: > > My problem is: > > Given a (multiline) string, I want a function which remove all leading and trailing > white-space (as given by \s). > > Examples: > " abbds \n sass " => "abbds \n sass" > " a " => "a" > " \n first phrase \n second phrase \n \n" => "first phrase \n second >phrase" > " \017 a " => "\017 a" > " " => "" > > These also show the following cases: > * space in between goes on unchanged, > * also characters which are not space and which does not match \w (like \017), must > remain unchanged too, > * strings with only spaces map into the empty string > > I have tried > > sub trim { > my ($text) = @_; > $text =~ m<^\s*(?=\S)(.*)(?=\S)\s*$>s; > return $2; > } > > The rationale is: (1) scan leading spaces, (2) match a zero-length assertion when > a non space is encountered, (3) scan everything collecting into $2 until > (4) a zero-length assertion for a non space is matched, (5) followed > by trailing spaces. Then I catch $2. > > But it does not work. If I change the pattern to > ^\s*\b(.*)\b\s*$ > and return $1, it works except for cases like " \017 a ". > I'm not sure I have understood how to use (?= ). Is \b equivalent > to (?=\w) ? > > I would like the solution as concise and simple as possible.
Have you looked at the solution in the FAQ? perldoc -q "strip blank space" How do I strip blank space from the beginning/end of a string? Although the simplest approach would seem to be: $string =~ s/^\s*(.*?)\s*$/$1/; Not only is this unnecessarily slow and destructive, it also fails with embedded newlines. It is much faster to do this operation in two steps: $string =~ s/^\s+//; $string =~ s/\s+$//; Or more nicely written as: for ($string) { s/^\s+//; s/\s+$//; } This idiom takes advantage of the `foreach' loop's alias ing behavior to factor out common code. You can do this on several strings at once, or arrays, or even the values of a hash if you use a slice: # trim whitespace in the scalar, the array, # and all the values in the hash foreach ($scalar, @array, @hash{keys %hash}) { s/^\s+//; s/\s+$//; } John -- use Perl; program fulfillment -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]