summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Text/ParseWords.pm49
1 files changed, 27 insertions, 22 deletions
diff --git a/lib/Text/ParseWords.pm b/lib/Text/ParseWords.pm
index bd95b4f204..62da1d273f 100644
--- a/lib/Text/ParseWords.pm
+++ b/lib/Text/ParseWords.pm
@@ -37,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.
-
&quotewords() 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.
@@ -90,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 (length($_)) {
+ while (length) {
$field = '';
+
for (;;) {
$snippet = '';
- if (s/^"(([^"\\]|\\.)*)"//) {
+
+ 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/^\\(.)//) {
- $snippet = $1;
- $snippet = "\\$snippet" if ($keep);
- }
- elsif (!length($_) || s/^$delim//) {
- last;
+ elsif (!length || s/^$delim//) {
+ last;
}
else {
- while ($_ ne '' && !(/^$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;
}