The Path::Class module is a top-rated module and has very good reviews at cpan.org. I wonder whether the Path::Class:Dir module can create directory tree like this*:
/home/scottie/perl/lib/Path-Class-0.25
-> lib/
-> Path/
-> Class/
-> Dir.pm
-> Entity.pl
-> File.pl
-> Class.pl
-> t/
-> 01-basic.t
-> 02-foreign.t
-> 03-filesystem.t
-> 04-subclass.t
-> 05-traverse.t
-> author-critic.t
-> Build.PL
-> Changes
-> dist.ini
-> INSTALL
-> LICENSE
-> Makefile.PL
-> MANIFEST
-> META.yml
-> README
-> SIGNATURE
*) Source: Path-Class-0.25.tar.gz file and "/" at the end of string indicated directory (like ls -p in *nix systems)
And not like this (full path from root):
/home/scottie/perl/lib/Path-Class-0.25
-> /home/scottie/perl/lib/Path-Class-0.25/lib/
-> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/
-> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class/
-> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class/Dir.pm
-> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class/Entity.pl
-> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class/File.pl
-> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class.pl
-> /home/scottie/perl/lib/Path-Class-0.25/t/
-> /home/scottie/perl/lib/Path-Class-0.25/t/01-basic.t
-> /home/scottie/perl/lib/Path-Class-0.25/t/02-foreign.t
-> /home/scottie/perl/lib/Path-Class-0.25/t/03-filesystem.t
-> /home/scottie/perl/lib/Path-Class-0.25/t/04-subclass.t
-> /home/scottie/perl/lib/Path-Class-0.25/t/05-traverse.t
-> /home/scottie/perl/lib/Path-Class-0.25/t/author-critic.t
-> /home/scottie/perl/lib/Path-Class-0.25/Build.PL
-> /home/scottie/perl/lib/Path-Class-0.25/Changes
-> /home/scottie/perl/lib/Path-Class-0.25/dist.ini
-> /home/scottie/perl/lib/Path-Class-0.25/INSTALL
-> /home/scottie/perl/lib/Path-Class-0.25/LICENSE
-> /home/scottie/perl/lib/Path-Class-0.25/Makefile.PL
-> /home/scottie/perl/lib/Path-Class-0.25/MANIFEST
-> /home/scottie/perl/lib/Path-Class-0.25/META.yml
-> /home/scottie/perl/lib/Path-Class-0.25/README
-> /home/scottie/perl/lib/Path-Class-0.25/SIGNATURE
I tried to do it but there is something wrong with my code:
#------------------8<------------------
my $dir = Path::Class::Dir->new('/home/scottie/perl/lib/Path-Class-0.25');
my $nfiles = $dir->traverse(sub {
my ($child, $cont) = @_;
return if -l $child; # don't follow symlinks
#print Dumper($child);
#print "$child\n";
print $child->{'dir'}{'dirs'}[-1];
print " -> ";
print $child->{'file'};
print "\n";
return $cont->();
});
#------------------8<------------------
Could you please have a gander at my code and tell me how to make a directory tree without full paths in $child?
Many thanks!
Best regards,
Scottie
You need to use the basename method of Class::Path::File (which is also available as a method of Class::Path::Dir) to extract just the last element of the path.
You must also use a parameter to the callback to keep track of the current level of indentation.
This program appears to fulfil your requirement.
use strict;
use warnings;
use Path::Class;
my $dir = dir('/home/scottie/perl/lib/Path-Class-0.25');
$dir->traverse(sub {
my ($child, $cont, $indent) = @_;
$indent //= 0;
if ($indent == 0) {
print $child, "\n";
}
else {
print ' ' x ($indent - 1), '-> ', $child->basename;
print '/' if $child->is_dir;
print "\n";
}
$cont->($indent + 1);
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With