in reply to Neverending Foreach Loop

$file-> defectdata looks like a function call and is likely to return something different each time it's called. Maybe what you want to do is:

foreach (@files) { $file = "$klarfdir" . "\\" . "$_"; $file = Klarf::Parser->new($file); my %result = %{ $file->defectdata () }; foreach ( keys %result ) { print( $result{$_}->{XINDEX} ); } }

DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^2: Neverending Foreach Loop
by ~~David~~ (Hermit) on Jul 12, 2007 at 23:12 UTC
    That worked.
    Thank you.
    I don't understand why it returns somthing different though.
    ~~David~~

      It's a function call. Looks like it's for a parser. I'd guess each time it's called it returns a result from parsing the next "chunk". You need to read to docs for the module.


      DWIM is Perl's answer to Gödel
      Even if the contents of the hash are the same each time you call the sub, it's still a different hash. To take the most trivial example:
      sub get_hashref { my %hash; return \%hash; }
      it creates a new my %hash each time it's called, since the old one went out of scope and no longer exists1. If you want to prove this to yourself, create a trivial sub like that and call it twice, storing both hashrefs. Add some data to one hashref, then look in the other - it will still be empty.

      (There are ways to have it return references to the same hash every time it's called, such as

      my %hash; sub get_hashref2 { return \%hash; }
      but defectdata() apparently doesn't do this.)

      1 Not entirely true, in that the previous hash still exists and can be accessed by the previously-returned hashref, but it has become anonymous and is no longer my %hash. Read up on "closures" for more about how this works (and how it can be used to do some pretty powerful stuff).