summaryrefslogtreecommitdiff
path: root/lib/shellwords.pl
diff options
context:
space:
mode:
authorLarry Wall <lwall@netlabs.com>1991-06-06 23:28:14 +0000
committerLarry Wall <lwall@netlabs.com>1991-06-06 23:28:14 +0000
commit9ef589d8078fdf16316dec772c00e81b3c38fd22 (patch)
treee45650d2a4acb876fe2b249e8727e066c5be4c90 /lib/shellwords.pl
parent352d5a3ab0aab9889c59e847643d265e062cec0b (diff)
downloadperl-9ef589d8078fdf16316dec772c00e81b3c38fd22.tar.gz
perl 4.0 patch 8: patch #4, continued
See patch #4.
Diffstat (limited to 'lib/shellwords.pl')
-rw-r--r--lib/shellwords.pl42
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/shellwords.pl b/lib/shellwords.pl
new file mode 100644
index 0000000000..168991fa3f
--- /dev/null
+++ b/lib/shellwords.pl
@@ -0,0 +1,42 @@
+#; 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;
+ }
+ elsif (s/^([^\s\\'"]+)//) {
+ $snippet = $1;
+ }
+ else {
+ s/^\s+//;
+ last;
+ }
+ $field .= $snippet;
+ }
+ push(@words, $field);
+ }
+ @words;
+}
+1;