Nicholas Clark wrote: > On Tue, Aug 26, 2008 at 02:30:47PM +0100, Steve Hay wrote: >> Nicholas Clark wrote: > >>> Odd. So try something else: If you change t/op/local.t from >>> >>> like( runperl(stderr => 1, >>> prog => 'use constant foo => q(a);' . >>> 'index(q(a), foo);' . >>> 'local *g=${::}{foo};print "ok";'), "ok", >>> "[perl #52740]"); >>> >>> to >>> >>> like( runperl(stderr => 1, >>> prog => 'use constant foo => q(a);' . >>> 'index(q(a), foo);' . >>> 'local *g=${::}{foo};print "ok\n";'), "ok", >>> "[perl #52740]"); >>> >>> >>> does that make t/op/local.t pass? >> >> No, it didn't. But #34228 does. >> >> It seems that runperl() is a little flaky when it comes to handling >> quotes in different shells. Perhaps it is best to always use q() and >> qq(). > > Yes. I wondered that. But I looked at the code and thought that it > was always using a temporary file. Hence I didn't try committing that > change blind yesterday. > > I wonder what I missed.
It's in _create_runperl() isn't it? If you pass a prog, then it sets $args{progs} = [$args{prog}] and then, since you now have progs, it builds a command from a series of -e options: foreach my $prog (@{$args{progs}}) { if ($is_mswin || $is_netware || $is_vms) { $runperl .= qq ( -e "$prog" ); } else { $runperl .= qq ( -e '$prog' ); } } > > (And if it was using -e, I was going to make test.pl default to > warning if it found ' or " with an option to turn that warning off) If you do, then a warning about embedded newlines would also be useful. That's tripped me up a couple of times, e.g. http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2006-07/msg00727. html http://public.activestate.com/cgi-bin/perlbrowse/p/31985