X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FShell.pm;h=c2f522cae309363daeac532639022f40f59c10ad;hb=22d4bb9ccb8701e68f9243547d7e3a3c55f70908;hp=62aa82964c19c5da1679b395b46bb01191275622;hpb=4b19af017623bfa3bb72bb164598a517f586e0d3;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Shell.pm b/lib/Shell.pm index 62aa829..c2f522c 100644 --- a/lib/Shell.pm +++ b/lib/Shell.pm @@ -1,8 +1,13 @@ package Shell; use 5.005_64; -our($capture_stderr, $VERSION); +use strict; +use warnings; +our($capture_stderr, $VERSION, $AUTOLOAD); -$VERSION = '0.2'; +$VERSION = '0.3'; + +sub new { bless \$VERSION, shift } # Nothing better to bless +sub DESTROY { } sub import { my $self = shift; @@ -10,24 +15,24 @@ sub import { my @EXPORT; if (@_) { @EXPORT = @_; - } - else { + } else { @EXPORT = 'AUTOLOAD'; } - foreach $sym (@EXPORT) { + foreach my $sym (@EXPORT) { + no strict 'refs'; *{"${callpack}::$sym"} = \&{"Shell::$sym"}; } -}; +} -AUTOLOAD { +sub AUTOLOAD { + shift if ref $_[0] && $_[0]->isa( 'Shell' ); my $cmd = $AUTOLOAD; $cmd =~ s/^.*:://; eval <<"*END*"; sub $AUTOLOAD { if (\@_ < 1) { \$Shell::capture_stderr ? `$cmd 2>&1` : `$cmd`; - } - elsif ('$^O' eq 'os2') { + } elsif ('$^O' eq 'os2') { local(\*SAVEOUT, \*READ, \*WRITE); open SAVEOUT, '>&STDOUT' or die; @@ -46,16 +51,14 @@ AUTOLOAD { close READ; waitpid \$pid, 0; \@ret; - } - else { + } else { local(\$/) = undef; my \$ret = ; close READ; waitpid \$pid, 0; \$ret; } - } - else { + } else { my \$a; my \@arr = \@_; if ('$^O' eq 'MSWin32') { @@ -74,11 +77,10 @@ AUTOLOAD { s/\\\\\\\\"/\\\\\\\\"""/g; \$_ = qq["\$_"] if /\\s/; } - } - else { + } else { for (\@arr) { s/(['\\\\])/\\\\\$1/g; - \$_ = "'\$_'"; + \$_ = \$_; } } push \@arr, '2>&1' if \$Shell::capture_stderr; @@ -88,8 +90,7 @@ AUTOLOAD { my \@ret = ; close SUBPROC; # XXX Oughta use a destructor. \@ret; - } - else { + } else { local(\$/) = undef; my \$ret = ; close SUBPROC; @@ -104,6 +105,7 @@ AUTOLOAD { } 1; + __END__ =head1 NAME @@ -155,10 +157,45 @@ The module now should work on Win32. Jenda +There seemed to be a problem where all arguments to a shell command were +quoted before being executed. As in the following example: + + cat('new; + print $sh->ls; + +Casey + =head1 AUTHOR Larry Wall Changes by Jenda@Krynicky.cz and Dave Cottle +Changes and bug fixes by Casey Tweten + =cut