develooper Front page | perl.perl5.porters | Postings from March 2001

[ID 20010328.015] glob() in scalar context returns names one at atime, not recursive.

Thread Next
Joe Smith
March 28, 2001 21:28
[ID 20010328.015] glob() in scalar context returns names one at atime, not recursive.
Message ID:
This is a bug report for perl from
generated with the help of perlbug 1.33 running under perl v5.6.1.

[Please enter your report here]

This is a pod patch and a bug report.

Documentation update:

*** perlfunc.pod.orig   Thu Jan  4 20:34:28 2001
--- perlfunc.pod        Wed Mar 28 21:03:29 2001
*** 1985,1990 ****
--- 1985,1998 ----
  Beginning with v5.6.0, this operator is implemented using the standard
  C<File::Glob> extension.  See L<File::Glob> for details.
+ In scalar context, returns one name at a time.  Call glob with the
+ same arguments repeatedly to get them all.
+    perl -le 'while ($_ = glob "/tmp/*") {print}'
+ Note: glob() in scalar context is not recursive.  Use C<File::Find>
+ to process subdirectories.
  =item gmtime EXPR
  Converts a time as returned by the time function to a 8-element list


Bug report:

When called in scalar context, glob() returns one name at a time.  This
works OK if glob() is called repeated with the same argument over and
over until the cached list of matches is exhausted.

But if glob() is called with a different argument before the cache is
emptied, the partial results are not saved.  Recursive descent down the
directory tree is OK, but an infinite loop occurs on the way back up.

glob() should either handle recursive calls in scalar context, or it
should die() cleanly on the way back up.

The enclose program exhibits the error when run with a nonzero command
line argument (such as "9").

print "Testing use of repeated calls to glob() in scalar context\n";
# Should produce results similar to grep(!/^\./,readdir()).

$start = "/etc/lp";		# A not-very deep dir tree on Solaris-6
$max = @ARGV ? shift : 0;	# Number of directories to do in bug mode
print $max ? "Recursive mode: expect failure\n" : "Works: push results\n";

$count = $depth = 0;
print "done\n";

sub do_dir {
  my $dir = shift;
  my $prefix = "  " x ++$depth;
  my @todo;
  my $files = $dir . "*";
  print "$prefix Looking for $files\n";
  die "Too many directories processed: $max" if $max && ++$count > $max;
  while ($name = glob $files) {		# Repeated calls in scalar context
    if (-d $name) {
      print "$prefix $name is a directory\n";
      $max ? do_dir("$name/") : push @todo,"$name/";
    } else {
      print "$prefix $name is not a directory\n";
  foreach $dir (@todo) {		# If $max set, do dirs after loop
  print "$prefix End     of  $files\n";

[Please do not change anything below this line]
Site configuration information for perl v5.6.1:

Configured by jms at Thu Jan  4 15:37:43 PST 2001.

Summary of my perl5 (revision 5.0 version 6 subversion 1) configuration:
    osname=solaris, osvers=2.6, archname=sun4-solaris
    uname='sunos centauri 5.6 generic_105181-07 sun4u sparc sunw,ultra-2 '
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
    useperlio=undef d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    cc='gcc', ccflags ='-fno-strict-aliasing -I/usr/local/include -I/opt/local/include -I/opt/gnu/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    cppflags='-fno-strict-aliasing -I/usr/local/include -I/opt/local/include -I/opt/gnu/include'
    ccversion='', gccversion='2.95.2 19991024 (release)', gccosandvers='solaris2.6'
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=4321
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, usemymalloc=y, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =' -L/usr/local/lib -L/opt/local/lib -L/opt/gnu/lib '
    libpth=/usr/local/lib /opt/local/lib /opt/gnu/lib /lib /usr/lib /usr/ccs/lib
    libs=-lsocket -lnsl -lgdbm -ldb -ldl -lm -lc -lcrypt -lsec
    perllibs=-lsocket -lnsl -ldl -lm -lc -lcrypt -lsec
    libc=/lib/, so=so, useshrplib=false, libperl=libperl.a
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags=' '
    cccdlflags='-fPIC', lddlflags='-G -L/usr/local/lib -L/opt/local/lib -L/opt/gnu/lib'

Locally applied patches:

@INC for perl v5.6.1:

Environment for perl v5.6.1:
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PERL_BADLANG (unset)

Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About