http://qs321.pair.com?node_id=1105761


in reply to Re^3: Novice problem: How to push a MooX Struct into a list?
in thread Novice problem: How to push a MooX Struct into a list?

Thank you Loops and boftx!

Using the constructor for empty array as Loops showed, the script indeed ran without spewing errors.

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.

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 :(

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 c +rawldir( $curpath\/$_)\n"; push @{$dno->subdlist}, crawldir( "$curpath\/$_" ); } } return $dno; }

Replies are listed 'Best First'.
Re^5: Novice problem: How to push a MooX Struct into a list?
by Loops (Curate) on Nov 01, 2014 at 00:06 UTC

    boftx was right and spotted the problem with argument passing to your printdirs sub. You also had a problem with the dereferencing syntax:

    @($mydir->subdlist) should be @{$mydir->subdlist}

    Also, while it's not an error, the check to see if the array is empty is redundant, the for loop wont run if there are zero elements in the array. So the sub could be rewritten as:

    sub printdirs { my ($mydir) = @_; printdirs($_) for @{$mydir->subdlist}; print "Dir: ", $mydir->dirname, "\n"; }
Re^5: Novice problem: How to push a MooX Struct into a list?
by boftx (Deacon) on Oct 31, 2014 at 23:43 UTC

    You probably want my $mydir = shift; or my ($mydir) = @_; from what I can see (but I'm still sober).

    You must always remember that the primary goal is to drain the swamp even when you are hip-deep in alligators.

      My mistakes make me feel like a temple monkey trying to learn Perl :)

      Every paragraph of your explanations was helpful to me! Now it works!

      Thank you for your patience boftx and Loops :)

        We've all been there, trust me, even if some of the, errrr, old farts like me don't want to admit it.

        You must always remember that the primary goal is to drain the swamp even when you are hip-deep in alligators.