Well I've moved this along a little further, but it
looks like I'm stuck on one last thing.

I'm getting;

C:\Perl\scripts\dir\dir\dir

                      basename  0001
                      basename  0002
                      basename  0003
                      basename  0004
                      basename  0005
                      basename  0006
                      basename  0007
                      basename  0008
                      basename  0009
                      basename  0010
      another_basename  0001
      another_basename  0002
      another_basename  0003
      another_basename  0004
      another_basename  0005
      another_basename  0006
        yet_another_name  0001
        yet_another_name  0002
        yet_another_name  0003
        yet_another_name  0004
        yet_another_name  0005

C:\Perl\scripts\dir\dir\dir\sub_directory

                      basename  0001
                      basename  0002
                      basename  0003
                      basename  0004
                      basename  0005
                      basename  0006
                      basename  0007
                      basename  0008
                      basename  0009
                      basename  0010

C:\Perl\scripts\dir\dir\dir\sub_directory\deeper_sub

                        basename  0001
                        basename  0002
                        basename  0003
                        basename  0004

The following is the re-worked script:

----------------snip---------------------

#!/usr/bin/perl -w

use strict;

my %HoA;
for ( `dir /b/s` ) {
        push @{ $HoA{$1} }, $2 if
/(.+)\\(\w+)\.(\d+)\.(\w+)$/;
}

my %count;
for my $dir ( sort keys %HoA ) {
        print "$dir\n";
        my @basenames = @{ $HoA{$dir} };
        for my $frames ( @basenames ) {
                $count{$frames} += 1;
                printf "%30s\t%04d\n", $frames,
$count{$frames};
        }
}

----------------snip---------------------

I'm trying to get the following output:

C:\Perl\scripts\dir\dir\dir

                         basename  0010
         another_basename  0006
 yet_another_basename  0005

C:\Perl\scripts\dir\dir\dir\sub_directory

                      basename  0010

C:\Perl\scripts\dir\dir\dir\sub_directory\deeper_sub

                        basename  0004

I've gone through 'perldoc perlreftut', but can't see
the last step.
--- Gunnar Hjalmarsson <[EMAIL PROTECTED]> wrote:

> [ replying to the list since that's where the
> discussion belongs ]
> 
> Ron Smith wrote (to me privately):
> > Thank you *very* much for furthering my 'Perl'
> knowlege. I've
> > never see a variable like '@{ $HoA{$dir} }'
> before.
> 
> Well, it's not a special variable type. $HoA{$dir}
> is a reference to an 
> anonymous array, which you dereference with the @{
> $HoA{$dir} } construct.
> 
> > I'm just at the 'Llama' level. I think I
> understand what's going
> > on though.
> > Your solution:...
> > 
> > my %HoA;
> > for ( `dir /b/s` ) {
> >        push @{ $HoA{$1} }, $2 if
> /(.+)\\(\w+)\.\d+\.\w+$/;
> > }
> > 
> > for my $dir (sort keys %HoA ) {
> >        print "$dir\n", join( "\n", @{ $HoA{$dir} }
> ), "\n\n";
> > }
> > 
> > ...worked out fine. This one took some thought for
> me to wrap my
> > head around. Thank you so *very* much for showing
> me something
> > new and very useful.
> 
> I now realize that the small piece of code above
> combines three 
> components of Perl that make it a really powerful
> programming language: 
> Hashes, references and regular expressions.
> 
> > I'm attempting to play around with this new tool
> to get it to do
> > different things, but I'm running into another
> problem. I can't
> > seem to pull the elements back out from the arrays
> properly. I'm
> > tring to count the basenames now. I get what looks
> like memory
> > addresses instead. I think these are the
> references to the actual
> > arrays that you were eluding to.
> 
> Sounds plausible. :)
> 
> > I was using parts of the script you helped me out
> on before to do
> > the counting of the basenames:
> > 
> > #!/usr/bin/perl -w
> > 
> > use strict;
> > 
> > my @paths = `dir /b`;
> > my @basenames = &extract_names(@paths);
> > 
> > sub extract_names {
> >    my ($name, @names);
> >    for (@_) {
> >        if (/(\w+)\.\d+\.\w+$/) {
> >                        $name = $1;
> >                        $name =~ s/$/\n/;
> 
> Hmm.. It's usually practical to not add "\n" like
> that, but take care of 
> linebreaks in connection with printing the variable.
> Without adding 
> "\n", instead of saying
> 
>      print @basenames;
> 
> you can say e.g.
> 
>      print join("\n", @basenames), "\n";
> 
> >            push @names, $name;
> >        }
> >    }
> >    @names;
> > }
> > 
> > my (%count, $frames);
> > for $frames (@basenames) {
> >        chomp ($frames);
> >        $count{$frames} += 1;
> > }
> > for $frames (sort keys %count) {
> >        # print "$frames\t1-$count{$frames}\n";
> >        printf "%20s\t%04d\n", $frames,
> $count{$frames};
> > }
> > 
> > One of the things I attempted was the following:
> > 
> > #!/usr/bin/perl -w
> > 
> > use strict;
> >      my %HoA;
> > for ( `dir /b/s` ) {
> >     push @{ $HoA{$1} }, $2 if
> /(.+)\\(\w+)\.\d+\.\w+$/;
> > }
> > 
> > for my $dir (sort keys %HoA ) {
> >     print "$dir\n";
> >     for my $frames (@{ $HoA{$dir}}) {
> >         my $count{frames} += 1;
> >         print "$count{frames}\n";
> >     }
> > }
> > 
> > But, I get the following error messages:
> > 
> > syntax error at solution line 13, near
> "$count{frames"
> > syntax error at solution line 13, near "+="
> > syntax error at solution line 16, near "}"
> > Execution of solution aborted due to compilation
> errors.
> > 
> > There's some concept I'm missing,
> 
> No, it's rather just because you didn't declare the
> %count hash properly 
> (you also had 'frames' instead of '$frames' a couple
> of times). Instead of
> 
>      for my $frames (@{ $HoA{$dir}}) {
>          my $count{frames} += 1;
>          print "$count{frames}\n";
>      }
> 
> you want
> 
>      my %count;
>      for my $frames ( @{ $HoA{$dir} } ) {
>          $count{$frames} += 1;
>          print "$count{$frames}\n";
>      }
> 
> > and I was hoping you'd
> > help me out one more time. I've spent a lot of
> time on this
> > trying to solve the problem myself, but I keep
> hitting a
> > brick wall no matter what I try. I'm trying to
> get:
> > 
> > C:\dir_name\dir_name\dir_name             (Path)
> followed by
> > basename             0001-0005            (file
> counts)
> > another_basename     0001-0010
> > 
> > These files have the same basename, but they're
> numbered like:
> > basename.0001.rgb, basename.0002.rgb ...etc.
> 
> Now when I've helped you with the syntax error, I
> believe you can figure 
> out how to print the counts similar to what you did
> with the previous 
> code version. If not, please feel free to post (to
> the list) again.
> 
> > Also, If you can, could you point me in the
> dirrection of a book or a
> > site that explains the more advanced stuff like:
> > 
> > @{$HoA{$dir}}
> > 
> > I would really appreciate it.
> 
> References and data structures are indeed tricky in
> the beginning - I 
> sure thought they were - but they are well
> documented at the same time. 
> These are some applicable parts of the Perl docs:
> 
>      perldoc perlreftut
>      perldoc perlref
> 
>      perldoc perldsc
>      perldoc perllol
> 
> As regards books, others are better suited than me
> to give 
> recommendations (the only Perl book I have is the
> "Camel").
> 
> 
=== message truncated ===



                
_______________________________
Do you Yahoo!?
Express yourself with Y! Messenger! Free. Download now. 
http://messenger.yahoo.com

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to