in reply to foreach in HoHoA problems

It looks like one of the elements of the array is undefined.

I'm also a little confused about what you're trying to print. For example:

SET: foreach $hit (@{$matches{$fastaseq}{$sitekey}}) {
The foreach is iterating over the elements of the array, and $hit is the value of each element, not the index. This is important later.

print "\$hit is: ",$hit,"\n";
This line prints the value of $hit. The following line, however,

print "\$hit is: ",$matches{$fastaseq}{$sitekey}[$hit],"\n";
uses that value as an index. I don't know how you populated the array, but unless the values of $hit really are index values, you're accessing possibly undefined array elements. In your example above, $hit = 6906413. Do you really have that many elements in the array?

I suspect you may be having trouble with dereferencing, but I don't know enough about the data struct you have and what you're trying to get out to give you an example. Can you post a partial dump of %matches and an example of what you want to print?

Update: If you want to iterate over the array using indices instead of the values, you can use something like

foreach my $index ( 0 .. $#array )
If you want to simply skip undefined elements in the array, you can use
next if( not defined $hit );

Replies are listed 'Best First'.
Re^2: foreach in HoHoA problems
by mdunnbass (Monk) on Oct 28, 2006 at 17:08 UTC
    Thanks for the help. All of the print statements included are solely for debugging purposes. Eventually, I will be removing them all.

    And you're right, I want to be iterating over the indices of the array, not the values. I certainly hope there aren't 7 million elemnts in the array! I think 70 is far more than I am expecting. As for you're suggestion of:

    foreach my $index ( 0 .. $#array )

    Would I have to write that as:

    foreach my $index ( 0 .. $#matches{$fastaseq}{$sitekey} )?

    As for undefined elements, I don't expect I'll see any. In a previous subroutine, I am pushing the positions of matches to an m// into the arrays in question, (that's what the 7 million coresponds to), so I expect all array elements will be numerical. Whether or not the array is undefined, however, depends entirely on whether or not m// came back as true. That's why I threw the if (@) in there.

    Thanks.
    Matt

      Would I have to write that as:
      foreach my $index ( 0 .. $#matches{$fastaseq}{$sitekey} )?

      You would have to write that as:

      foreach my $index ( 0 .. $#{$matches{$fastaseg}{$sitekey}} )
      Note the extra braces following "$#" and fully surrounding the  $matches{$fastaseg}{$sitekey} -- that latter bit constitutes an array reference, and perl won't be able to parse it as such next to "$#" unles the braces are there to establish the precedence for de-referencing the array ref that is the value of that hash element.

      As for undefined elements, I don't expect I'll see any.

      Yeah, we've all heard that before... (and we've all caught ourselves saying and believing the same thing, in reference to some chunk of code we've written). That's the best thing about making good use of a good debugger: it helps us to get past this kind of fantasy.