#; shellwords.pl #; #; Usage: #; require 'shellwords.pl'; #; @words = &shellwords($line); #; or #; @words = &shellwords(@lines); #; or #; @words = &shellwords; # defaults to $_ (and clobbers it) sub shellwords { package shellwords; local($_) = join('', @_) if @_; local(@words,$snippet,$field); s/^\s+//; while ($_ ne '') { $field = ''; for (;;) { if (s/^"(([^"\\]|\\.)*)"//) { ($snippet = $1) =~ s#\\(.)#$1#g; } elsif (s/^"(([^"\\]|\\.)*)//) { ($snippet = $1) =~ s#\\(.)#$1#g; } elsif (s/^'(([^'\\]|\\.)*)'//) { ($snippet = $1) =~ s#\\(.)#$1#g; } elsif (s/^'(([^'\\]|\\.)*)//) { ($snippet = $1) =~ s#\\(.)#$1#g; } elsif (s/^\\(.)//) { $snippet = $1; } elsif (s/^([^\s\\'"]+)//) { $snippet = $1; } else { s/^\s+//; last; } $field .= $snippet; } push(@words, $field); } @words; } 1;