note
dissident
<p>Thank you Loops and boftx!</p>
<p>Using the constructor for empty array as Loops showed, the script indeed ran without spewing errors.</p>
<p>I have looked a bit into the long script boftx pointed me at. It really remembers me of a game I liked much on old Apple II :) Many interesting Perl details, in a well-readable script. Not one of these cryptic examples in the docs... But I'll look at it tomorrow when I am not tired as now.</p>
<p>However, when trying to output the contents of the collected directory tree structures, I ran into another problem after adding a sub for this. I get an error "Global symbol "$mydir" requires explicit package name..." which I do not yet understand, as this is a my variable of a subroutine... Please excuse if I made an obvious blatant mistake :(</p>
<code>
use strict;
use warnings;
use diagnostics;
use 5.014; # so push/pop/etc work on scalars (experimental)
use MooX::Struct -rw, Dirnode => [ qw( $dirname @subdlist ) ];
my $dirroot = crawldir( ".");
printdirs ($dirroot);
sub printdirs {
my $mydir = $_;
# if subdirectories exist, walk them first
### vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv PROBLEM
if (@($mydir->subdlist)) {
# if ($mydir->subdlist) {
### ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PROBLEM
foreach ($mydir->subdlist) {
printdirs( $_);
}
}
print "Dir: ", $mydir->dirname, "\n";
}
sub crawldir {
my $curpath = shift;
my $dno = Dirnode["", []];
# my $dno = Dirnode->new();
$dno->dirname( $curpath );
opendir(DIR, $curpath);
my @files = readdir(DIR);
closedir(DIR);
print "crawldir in directory ", $dno->dirname, "\n";
foreach (@files) {
next if $_ eq '.' or $_ eq '..';
my $file_path = "$curpath/$_";
$file_path =~ s|/+|/|g;
if (-d $file_path) {
print "crawldir in directory ", $dno->dirname, ": calling crawldir( $curpath\/$_)\n";
push @{$dno->subdlist}, crawldir( "$curpath\/$_" );
}
}
return $dno;
}</code>
1105754
1105757