From: Casey R. Tweten Date: Wed, 16 Aug 2000 11:35:09 +0000 (-0400) Subject: Re: [ID 20000816.006] [PATCH @6655] Shell.pm, bug fix, strict and OO Interface X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=8d5b6de5e1eb7bf5df60c4299d3d7e78abf5d747;p=p5sagit%2Fp5-mst-13.2.git Re: [ID 20000816.006] [PATCH @6655] Shell.pm, bug fix, strict and OO Interface Message-ID: p4raw-id: //depot/perl@6666 --- 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