Revise quotewords()
Shishir Gundavaram [Tue, 1 Apr 1997 21:53:42 +0000 (09:53 +1200)]
lib/Text/ParseWords.pm

index bd95b4f..62da1d2 100644 (file)
@@ -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;
 }