summaryrefslogtreecommitdiff
path: root/lib/Text
diff options
context:
space:
mode:
authorAlexey Toptygin <alexeyt@freeshell.org>2006-04-20 15:42:20 +0000
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2006-04-21 13:01:09 +0000
commitd5c14ab28afc297a5ad2b7ac52ffd5c0cc1941a7 (patch)
tree4daeb9d006e8fcfb157873de3ede20e2a7e5a65a /lib/Text
parent76234dfb9b5ce1d0a5dafb80ee9a735679c4d6a3 (diff)
downloadperl-d5c14ab28afc297a5ad2b7ac52ffd5c0cc1941a7.tar.gz
Re: [perl #38904] Text::ParseWords doesn't always handle backslashes correctly
Message-ID: <Pine.NEB.4.62.0604201539380.20332@otaku.freeshell.org> p4raw-id: //depot/perl@27932
Diffstat (limited to 'lib/Text')
-rw-r--r--lib/Text/ParseWords.pm16
-rwxr-xr-xlib/Text/ParseWords.t8
2 files changed, 19 insertions, 5 deletions
diff --git a/lib/Text/ParseWords.pm b/lib/Text/ParseWords.pm
index 2f6812ade8..1411986cd9 100644
--- a/lib/Text/ParseWords.pm
+++ b/lib/Text/ParseWords.pm
@@ -1,7 +1,7 @@
package Text::ParseWords;
use vars qw($VERSION @ISA @EXPORT $PERL_SINGLE_QUOTE);
-$VERSION = "3.24";
+$VERSION = "3.25";
require 5.000;
@@ -12,9 +12,17 @@ use Exporter;
sub shellwords {
- my(@lines) = @_;
- $lines[$#lines] =~ s/\s+$//;
- return(quotewords('\s+', 0, @lines));
+ my (@lines) = @_;
+ my @allwords;
+
+ foreach my $line (@lines) {
+ $line =~ s/^\s+//;
+ my @words = parse_line('\s+', 0, $line);
+ pop @words if (@words and !defined $words[-1]);
+ return() unless (@words || !length($line));
+ push(@allwords, @words);
+ }
+ return(@allwords);
}
diff --git a/lib/Text/ParseWords.t b/lib/Text/ParseWords.t
index 74c2733580..00e2a401c7 100755
--- a/lib/Text/ParseWords.t
+++ b/lib/Text/ParseWords.t
@@ -8,7 +8,7 @@ BEGIN {
use warnings;
use Text::ParseWords;
-print "1..22\n";
+print "1..23\n";
@words = shellwords(qq(foo "bar quiz" zoo));
print "not " if $words[0] ne 'foo';
@@ -132,3 +132,9 @@ $string = qq{"missing quote};
$result = join('|', shellwords($string));
print "not " unless $result eq "";
print "ok 22\n";
+
+# make sure shellwords strips out leading whitespace and trailng undefs
+# from parse_line, so it's behavior is more like /bin/sh
+$result = join('|', shellwords(" aa \\ \\ bb ", " \\ ", "cc dd ee\\ "));
+print "not " unless $result eq "aa| | bb| |cc|dd|ee ";
+print "ok 23\n";