Here's a small tweak to your initial script which goes some way toward
shedding light on what was going wrong:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
use feature 'say';
my $d = './one';
find sub {
return if -f;
say $File::Find::name;
say "\$File::Find::dir<$File::Find::dir>\n";
}, $d;
The way it works it that `find` is traversing through the directories and
`$File::Find::dir` is the directory it's *in* when it calls your subroutine
on `$File::Find::name` which is inside that directory. When it was sitting
in `/three` it was only called on a non-directory (`three/tst.pl`) and
therefore didn't report that it was in directory `/three`.
Does that clarify things for you?
Andrew
On Sat, Jun 24, 2017 at 9:58 PM, Harry Putnam <[email protected]> wrote:
> [email protected] (Andrew Solomon) writes:
>
> > Hi Harry
> >
> > What do you want your code to do?
> >
>
> Devise a simple test script the counts the number of directories in a
> hierarchy (This is building toward a more complex script in the end).
> But taking small steps in an effort to really understand what is
> happening.
>
> >> find sub {
> >> return if -f;
> >> print "\$File::Find::dir<$File::Find::dir>\n";
> >> }, $d;
>
> Seemed to me, would do that. Skip -f type files and print all
> directory names.
>
> Instead I see:
>
> >> Output:
> >> reader > ./tst.pl
> >> $File::Find::dir<./one>
> >> $File::Find::dir<./one>
> >> $File::Find::dir<./one/two>
>
> That is the parent directory is printed twice, the second level is
> printed as I'd expect. The third level is not printed at all.
>
> I see on reflection that I should have just left any code concerning
> -f files clear out and simply selected -d type files and printed them,
> And more importantly changed what I'm printing... instead of
> File::Find::dir what at first blush seemed like the right choice but
> once you've selected only -d type then File::Find::name shows the
> whole path:
>
> find sub {
> if (-d) {
> print "\$File::Find::name<$File::Find::name>\n";
> }
> }, $d;
>
> Which does return what I would expect... so now I can build on that
> and try to get a little closer to something I can use.
>
> $File::Find::name<./one>
> $File::Find::name<./one/two>
> $File::Find::name<./one/two/three>
>
> I'm not really clear yet on why my first code did not cover all levels
> of the hierarchy but the second stab does.
>
> --
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> http://learn.perl.org/
>
>
>
--
Andrew Solomon
Mentor@Geekuni http://geekuni.com/
http://www.linkedin.com/in/asolomon