diff options
Diffstat (limited to 'gnu/usr.bin/perl/lib/Text/ParseWords.pm')
-rw-r--r-- | gnu/usr.bin/perl/lib/Text/ParseWords.pm | 59 |
1 files changed, 33 insertions, 26 deletions
diff --git a/gnu/usr.bin/perl/lib/Text/ParseWords.pm b/gnu/usr.bin/perl/lib/Text/ParseWords.pm index 89951387ef6..62da1d273fe 100644 --- a/gnu/usr.bin/perl/lib/Text/ParseWords.pm +++ b/gnu/usr.bin/perl/lib/Text/ParseWords.pm @@ -1,11 +1,13 @@ package Text::ParseWords; require 5.000; -require Exporter; -require AutoLoader; use Carp; -@ISA = qw(Exporter AutoLoader); +require AutoLoader; +*AUTOLOAD = \&AutoLoader::AUTOLOAD; + +require Exporter; +@ISA = qw(Exporter); @EXPORT = qw(shellwords quotewords); @EXPORT_OK = qw(old_shellwords); @@ -35,7 +37,6 @@ This version differs from the original in that it will _NOT_ default to using $_ if no arguments are given. I personally find the old behavior to be a mis-feature. - "ewords() works by simply jamming all of @lines into a single string in $_ and then pulling off words a bit at a time until $_ is exhausted. @@ -88,43 +89,49 @@ sub quotewords { # at a time behavior was necessary if the delimiter was going to be a # regexp (love to hear it if you can figure out a better way). - local($delim, $keep, @lines) = @_; - local(@words,$snippet,$field,$_); + my ($delim, $keep, @lines) = @_; + my (@words, $snippet, $field); + + local $_ = join ('', @lines); - $_ = join('', @lines); - while ($_) { + while (length) { $field = ''; + for (;;) { - $snippet = ''; - if (s/^"(([^"\\]|\\[\\"])*)"//) { + $snippet = ''; + + if (s/^"([^"\\]*(\\.[^"\\]*)*)"//) { $snippet = $1; - $snippet = "\"$snippet\"" if ($keep); + $snippet = qq|"$snippet"| if $keep; } - elsif (s/^'(([^'\\]|\\[\\'])*)'//) { + elsif (s/^'([^'\\]*(\\.[^'\\]*)*)'//) { $snippet = $1; - $snippet = "'$snippet'" if ($keep); + $snippet = "'$snippet'" if $keep; } elsif (/^["']/) { - croak "Unmatched quote"; + croak 'Unmatched quote'; } - elsif (s/^\\(.)//) { - $snippet = $1; - $snippet = "\\$snippet" if ($keep); - } - elsif (!$_ || s/^$delim//) { - last; + elsif (s/^\\(.)//) { + $snippet = $1; + $snippet = "\\$snippet" if $keep; + } + elsif (!length || s/^$delim//) { + last; } else { - while ($_ && !(/^$delim/ || /^['"\\]/)) { - $snippet .= substr($_, 0, 1); - substr($_, 0, 1) = ''; - } + while (length && !(/^$delim/ || /^['"\\]/)) { + $snippet .= substr ($_, 0, 1); + substr($_, 0, 1) = ''; + } } + $field .= $snippet; } - push(@words, $field); + + push @words, $field; } - @words; + + return @words; } |