1;# shellwords.pl 2;# 3;# Usage: 4;# require 'shellwords.pl'; 5;# @words = &shellwords($line); 6;# or 7;# @words = &shellwords(@lines); 8;# or 9;# @words = &shellwords; # defaults to $_ (and clobbers it) 10 11sub shellwords { 12 package shellwords; 13 local($_) = join('', @_) if @_; 14 local(@words,$snippet,$field); 15 16 s/^\s+//; 17 while ($_ ne '') { 18 $field = ''; 19 for (;;) { 20 use re 'taint'; # leave strings tainted 21 if (s/^"(([^"\\]|\\.)*)"//) { 22 ($snippet = $1) =~ s#\\(.)#$1#g; 23 } 24 elsif (/^"/) { 25 die "Unmatched double quote: $_\n"; 26 } 27 elsif (s/^'(([^'\\]|\\.)*)'//) { 28 ($snippet = $1) =~ s#\\(.)#$1#g; 29 } 30 elsif (/^'/) { 31 die "Unmatched single quote: $_\n"; 32 } 33 elsif (s/^\\(.)//) { 34 $snippet = $1; 35 } 36 elsif (s/^([^\s\\'"]+)//) { 37 $snippet = $1; 38 } 39 else { 40 s/^\s+//; 41 last; 42 } 43 $field .= $snippet; 44 } 45 push(@words, $field); 46 } 47 @words; 48} 491; 50