Perl / perl5

🐪 The Perl programming language
https://dev.perl.org/perl5/
Other
1.85k stars 527 forks source link

File::Find::finddepth and find2perl -depth isn't depthfirst as find -depth is #1232

Closed p5pRT closed 19 years ago

p5pRT commented 24 years ago

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

Searchable as RT2218$

p5pRT commented 24 years ago

From dcd@tc.fluke.com

Created by dcd@tc.fluke.com

# given a directory tree such as

$ mkdir -p f/g/h $ touch f/a f/g/b f/g/h/c

I want to get what find -depth reports $ find f -depth -type d -print f/g/h f/g f

#f2p is my wrapper around find2perl (see below) $ f2p f -depth -type d -print f

# Here's a one liner that also just prints11 $ perl -wl -MFile​::Find -e 'File​::Find​::finddepth(   sub { -d $_ && print $File​::Find​::name; }\, "f")' f

# I wanted all 3 directories to be printed

# instrumenting the wanted subroutine

perl -wl -MCwd -MFile​::Find -e 'sub w{ print cwd\,"\t\$_=$_\t$File​::Find​::name" }   File​::Find​::finddepth( \&w \, "f")'

#reports something like (if made the columns line up) # cwd $_ $File​::Find​::name /tmp/f $_=a f/a /tmp/f $_=. f /tmp/f/g $_=b f/g/b /tmp/f/g $_=g f/g /tmp/f/g/h $_=c f/g/h/c /tmp/f/g/h $_=h f/g/h

Notice wanted does get called with each of the desired directories but that   1) they still aren't in the right order\, and   2) when calling wanted for directory f/g and f/g/h   we are not chdir'ed to the directory that would allow   testing of -d $_ (we are still in the $_ directory)

####### here is f2p #!/usr/local/bin/perl

# f2p # dcd@​tc.fluke.com # immediatly interpret the output find2perl

$FIND2PERL = '/usr/local/bin/find2perl';

pipe(READ\, WRITE); if (fork) {   close(WRITE);   $script = \<\<'DIE'; $SIG{__DIE__} = sub { print STDERR $_[0]; exit 1; }; DIE

  while ($out = \) {   $script .= $out;   }   print "eval $script;\n" if defined($debug);   eval $script;   # test and report if there was a syntax error or runtime error\, or a   # die statement was executed   if (length($@​)) {   die $@​;   }

} else {   close(READ);   close(STDOUT);   open(STDOUT\, ">&WRITE");   close(WRITE);   $| = 1;   do $FIND2PERL;   close(STDOUT); }

Perl Info ``` Site configuration information for perl v5.5.660: Configured by dcd at Thu Feb 24 09:54:36 PST 2000. Summary of my perl5 (revision 5.0 version 5 subversion 660) configuration: Platform: osname=linux, osvers=2.2.15pre10, archname=i686-linux uname='linux dd 2.2.15pre10 #2 thu feb 24 09:36:58 pst 2000 i686 ' config_args='-Doptimize=-g -de -Dcf_email=dcd@tc.fluke.com' hint=recommended, useposix=true, d_sigaction=define usethreads=undef use5005threads=undef useithreads=undef usesocks=undef useperlio=undef d_sfio=undef use64bits=undef uselargefiles=define usemultiplicity=undef Compiler: cc='cc', optimize='-g', gccversion=2.7.2.3 cppflags='-DDEBUGGING -I/usr/local/include' ccflags ='-DDEBUGGING -I/usr/local/include' stdchar='char', d_stdstdio=define, usevfork=false intsize=4, longsize=4, ptrsize=4, doublesize=8 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=4 alignbytes=4, usemymalloc=n, prototype=define Linker and Libraries: ld='cc', ldflags =' -L/usr/local/lib' libpth=/usr/local/lib /lib /usr/lib libs=-lgdbm -ldbm -ldb -ldl -lm -lc libc=/lib/libc.so.5.4.44, so=so, useshrplib=false, libperl=libperl.a Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic' cccdlflags='-fpic', lddlflags='-shared -L/usr/local/lib' Locally applied patches: @INC for perl v5.5.660: /usr/local/lib/perl5/5.5.660/i686-linux /usr/local/lib/perl5/5.5.660 /usr/local/lib/perl5/site_perl/5.5.660/i686-linux /usr/local/lib/perl5/site_perl/5.5.660 /usr/local/lib/perl5/site_perl . Environment for perl v5.5.660: HOME=/home/dcd LANG (unset) LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/home/dcd/bin:/sbin:/usr/local/bin:/bin:/usr/bin:/usr/X11/bin:/usr/games:/usr/local/samba:/home/hobbes/tools/scripts:/home/hobbes/tools/linux:/usr0/hobbes/tools/scripts:/usr0/dcd/bin:/apps/general/bin:/usr/public PERL_BADLANG (unset) SHELL=/bin/bash ```
p5pRT commented 19 years ago

From @smpeters

I ran the one-liner you have above on Perl 5.8.5 on i686-linux\, and got...

steve@​kirk find $ perl -wl -MFile​::Find -e 'File​::Find​::finddepth(sub { -d $_ && print $File​::Find​::name; }\, "f")' f/g/h f/g f

It appears that this has been fixed somewhere along the line.

p5pRT commented 19 years ago

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