Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

do FILE does not set $? (like cat FILE would) #12765

Closed
p5pRT opened this issue Feb 11, 2013 · 6 comments
Closed

do FILE does not set $? (like cat FILE would) #12765

p5pRT opened this issue Feb 11, 2013 · 6 comments

Comments

@p5pRT
Copy link

p5pRT commented Feb 11, 2013

Migrated from rt.perl.org#116713 (status was 'resolved')

Searchable as RT116713$

@p5pRT
Copy link
Author

p5pRT commented Feb 11, 2013

From @jimav

This is a bug report for perl from james_avera@​yahoo.com,
generated with the help of perlbug 1.39 running under perl 5.14.2.


perlfunc for 'do' says​:

" do 'stat.pl';
is just like
  eval `cat stat.pl`;
except [all those good things...]"

However $? is not being set, which is different than eval `cat ...`
and also prevents reliable detection of a missing file.

Suggest making 'do EXPR' set $? (and $!), or else update the docs
to add this to the list of differences from `cat ...`.

#!/usr/bin/perl
use strict; use warnings;
sub u($) { defined($_[0]) ? $_[0] : "undef" }

$? = 33;
my $r1 = do "/dev/null";
print "do '/dev/null' returned ",u($r1)," and \$?=$?\n";

$? = 44;
my $r2 = eval `cat /dev/null`;
print "eval 'cat...' returned ",u($r2)," and \$?=$?\n";



Flags​:
  category=docs
  severity=low


Site configuration information for perl 5.14.2​:

Configured by Debian Project at Tue Nov 27 00​:34​:23 UTC 2012.

Summary of my perl5 (revision 5 version 14 subversion 2) configuration​:
 
  Platform​:
  osname=linux, osvers=2.6.42-32-generic, archname=x86_64-linux-gnu-thread-multi
  uname='linux allspice 2.6.42-32-generic #51-ubuntu smp wed sep 26 21​:33​:09 utc 2012 x86_64 x86_64 x86_64 gnulinux '
  config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.14 -Darchlib=/usr/lib/perl/5.14 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.14.2 -Dsitearch=/usr/local/lib/perl/5.14.2 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Duse64bitint -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -Ui_libutil -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.14.2 -des'
  hint=recommended, useposix=true, d_sigaction=define
  useithreads=define, usemultiplicity=define
  useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
  use64bitint=define, use64bitall=define, uselongdouble=undef
  usemymalloc=n, bincompat5005=undef
  Compiler​:
  cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
  optimize='-O2 -g',
  cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
  ccversion='', gccversion='4.6.3', gccosandvers=''
  intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
  d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
  ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
  alignbytes=8, prototype=define
  Linker and Libraries​:
  ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
  libpth=/usr/local/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib /usr/lib
  libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
  perllibs=-ldl -lm -lpthread -lc -lcrypt
  libc=, so=so, useshrplib=true, libperl=libperl.so.5.14.2
  gnulibc_version='2.15'
  Dynamic Linking​:
  dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
  cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector'

Locally applied patches​:
 


@​INC for perl 5.14.2​:
  /home/jima/lib/perl
  /home/jima/perl5/lib/perl5/x86_64-linux-gnu-thread-multi
  /home/jima/perl5/lib/perl5/x86_64-linux-gnu-thread-multi
  /home/jima/perl5/lib/perl5
  /etc/perl
  /usr/local/lib/perl/5.14.2
  /usr/local/share/perl/5.14.2
  /usr/lib/perl5
  /usr/share/perl5
  /usr/lib/perl/5.14
  /usr/share/perl/5.14
  /usr/local/lib/site_perl
  .


Environment for perl 5.14.2​:
  HOME=/home/jima
  LANG=en_US.UTF-8
  LANGUAGE=
  LD_LIBRARY_PATH=/home/jima/local/lib
  LOGDIR (unset)
  PATH=/home/jima/perl5/bin​:/home/jima/bin​:/home/jima/local/bin​:/home/jima/jima_tools/bin​:/usr/bin​:/bin​:/usr/sbin​:/sbin​:/usr/bin/X11​:/usr/local/bin​:/usr/local/sbin​:/usr/games​:.
  PERL5LIB=/home/jima/lib/perl​:/home/jima/perl5/lib/perl5/x86_64-linux-gnu-thread-multi​:/home/jima/perl5/lib/perl5
  PERL_BADLANG (unset)
  PERL_LOCAL_LIB_ROOT=/home/jima/perl5
  PERL_MB_OPT=--install_base /home/jima/perl5
  PERL_MM_OPT=INSTALL_BASE=/home/jima/perl5
  SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Feb 11, 2013

From @arc

Jim Avera <perlbug-followup@​perl.org> wrote​:

perlfunc for 'do' says​:

" do 'stat.pl';
is just like
eval `cat stat.pl`;
except [all those good things...]"

However $? is not being set, which is different than eval `cat ...`

Well, $? (aka $CHILD_ERROR) is the variable that contains the exit
status of the last process run. When you do "eval `cat $file`", that
involves running cat(1), so there is, as expected, a process whose
status can be reported.

But plain "do $file" doesn't need to create a process, and I think
it's correct that it doesn't. So I don't expect it to set $?.

and also prevents reliable detection of a missing file.

That can already be done by examining $!​:

$ perl -wE 'for my $f (qw</dev/null /nope>) { my ($r, $err, $exn) =
map $_ // "<undef>", scalar(do $f), $!, $@​; say "$f​: r=$r exn=$exn
err=$err" }'
/dev/null​: r=<undef> exn= err=
/nope​: r=<undef> exn= err=No such file or directory

Suggest making 'do EXPR' set $? (and $!), or else update the docs
to add this to the list of differences from `cat ...`.

Would this documentation change be good enough in your view?

Inline Patch
diff --git i/pod/perlfunc.pod w/pod/perlfunc.pod
index 0541bfd..2962a95 100644
--- i/pod/perlfunc.pod
+++ w/pod/perlfunc.pod
@@ -1558,11 +1558,11 @@ file as a Perl script.

     do 'stat.pl';

-is just like
+is largely like

     eval `cat stat.pl`;

-except that it's more efficient and concise, keeps track of the current
+except that it's more concise, runs no external processes, keeps
track of the current filename for error messages\, searches the C\<@​INC> directories\, and updates C\<%INC> if the file is found\. See L\ and L\ for these variables\. It also differs in that code evaluated with C\

--
Aaron Crane ** http​://aaroncrane.co.uk/

@p5pRT
Copy link
Author

p5pRT commented Feb 11, 2013

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Feb 21, 2013

From @arc

I haven't heard back from you, but I'm assuming that wording change helps enough.

Applied as c319391

Thanks.

--
Aaron Crane ** http​://aaroncrane.co.uk/

@p5pRT
Copy link
Author

p5pRT commented Feb 21, 2013

@arc - Status changed from 'open' to 'resolved'

@p5pRT p5pRT closed this as completed Feb 21, 2013
@p5pRT
Copy link
Author

p5pRT commented Feb 22, 2013

From @jimav

On 02/11/2013 02​:46 AM, Aaron Crane via RT wrote​:

That [detecting missing file] already be done by examining $! ...

(sorry for the delay, I've been swamped).
Thank you for pointing out that $! is set by "do FILE". I was
thinking wrongly.
Best,
-Jim

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant