Limo has asked for the wisdom of the Perl Monks concerning the following question:

HEEELLLPP! I really don't know what I'm doing wrong, but the output of this program prints duplicate and incrementing values for each variable in my print statement.
use strict; use File::Find; find (\&diag, $directory); sub diag { @diaglist = `cat $_ |grep SLOT`; my $device = $_; foreach $rtr_diag(@diaglist) { unless ($rtr_diag =~ m/Clock|Switch|Power|Processor/) { push @{$slots{$device}}, $rtr_diag; } } foreach $device (sort keys %slots) { my $diag_string = join "", @{$slots{$device}}; print "$device:\n"; print "===========================\n"; print "$diag_string\n\n"; } }

Replies are listed 'Best First'.
Re: Nesting/Loop/Print problem
by little (Curate) on Oct 05, 2000 at 21:24 UTC
    with doing
    push @{$slots{$device}}, $rtr_diag;
    you are populating an anonymous array, better try that with the already existant hash
    $slots{$device} = $rtr_diag;

    Have a nice day
    All decision is left to your taste
      That returns:
      Can't use string ("SLOT 6 (RP/LC 6 ): 4 Port Packe") as an ARRAY ref while "strict refs" in use at ./new-route-info.pl line 138, <RTRLIST> chunk 56.
        OK, but you have to change the composition of your diag_string as well, if you want to try, there'S still the anonymous array :-))
        Have a nice day
        All decision is left to your taste
RE: Nesting/Loop/Print problem
by Limo (Scribe) on Oct 05, 2000 at 21:09 UTC
    Just wondering why I'm taking a beating here? Just trying to learn a few things.
      I didn't downvote you, but here are a few reasons someone else might have:
      • You've posted the same code at least two other times.
      • Your explanation of the error is unclear.
      • You didn't provide an example of the output you're receiving.
      • You didn't provide an example of the input you're parsing.
      • You didn't provide an example of the output you wish to receive.
      • Your "cat $_ | grep FOO" is, at best, inefficient and is possibly a security hole. (What if someone creates a file named "; rm -rf / ;"?)
      It's hard to give a good answer when we're not sure what the question is.

      To your credit, you have pared down the original code somewhat (if I recall correctly), but you will get better help if you will provide the information listed above.

      I would also recommend that you post as a followup to the parent here -- posting multiple questions on the same subject is unnecessary, crowds the forum, and spreads out your potential replies. I don't need to reply to a post where someone like btrott has already given a good answer, but if there are multiple questions, I might duplicate his work in another thread.

      Hope this helps.

        Thank you. In my haste and frustration, I didn't think this one through as clearly as I could have. I will see if I can clean this up a bit. In the mean time, I'll just take my lumps.