develooper Front page | perl.beginners | Postings from April 2008

Re: going through array of hash, it only goes through limited amountof keys while doing for each command

Thread Previous | Thread Next
From:
Richard Lee
Date:
April 23, 2008 18:37
Subject:
Re: going through array of hash, it only goes through limited amountof keys while doing for each command
John W. Krahn wrote:
> Richard Lee wrote:
>>
>> something is wrong with this..
>>
>> say %yahoo's key contains the variable , X
>>
>> I wanted to go through the @array which has array of hashes... to see 
>> if one of the value is equal to
>> X and if it is, wanted to assign the key of the @array to $ex_var..
>>
>> Tracing the program, it only goes through 6 lines of keys in @t_array 
>> (random keys) (it has 89 keys total).. what am i doing wrong?
>>
>>
>>
>>
>>      while (my ($keys,$values) = each(%yahoo) ) {
>>              no strict 'refs';
>>              MF: for my $i (0 .. $#t_array) {
>>                      for ( my($k,$v) = each(%{ $t_array[$i] } ) ) {
>
> The for loop is not doing what you appear to think it is supposed to 
> be doing:
>
> $ perl -le'
> my %hash = "A" .. "Z";
> for my $c ( 1 .. 3 ) {
>     my $i;
>     for ( my ( $k, $v ) = each %hash ) {
>         print "$c ", ++$i, qq[: \$_ = "$_"   \$k = "$k"   \$v = "$v"];
>         }
>     }
> '
> 1 1: $_ = "S"   $k = "S"   $v = "T"
> 1 2: $_ = "T"   $k = "S"   $v = "T"
> 2 1: $_ = "A"   $k = "A"   $v = "B"
> 2 2: $_ = "B"   $k = "A"   $v = "B"
> 3 1: $_ = "O"   $k = "O"   $v = "P"
> 3 2: $_ = "P"   $k = "O"   $v = "P"
>
>
> You need to use each() in a while loop instead.
>
>
>>                          my $keys_b = qr/$keys/;
>>                          if ( $v  =~ m/$keys_b/ ) {
>>                              $ex_var = $k;
>>                              last MF;
>>                      }
>>                   }
>>              }
>
>
> John

finally understood what you meant.. thanks!!

#!/usr/bin/perl

use warnings;
use strict;
use Data::Dumper;

my %yahoo = qw(
        uno one
        dos two
);

my %color = qw(
        white  10
        yellow 20
        red   30
);

my @combine = ( \%yahoo, \%color );

print Dumper(@combine);


for my $href ( @combine ) {
    while ( my ($k, $v) = each %$href ) {
    #for my $keys ( keys %$href ) {
          print "\$k is $k\n";
          print "\$v is $v\n";
          print "==========\n";
    }
}


././././././ref_each.pl
$VAR1 = {
          'uno' => 'one',
          'dos' => 'two'
        };
$VAR2 = {
          'white' => '10',
          'red' => '30',
          'yellow' => '20'
        };
$k is uno
$v is one
==========
$k is dos
$v is two
==========
$k is white
$v is 10
==========
$k is red
$v is 30
==========
$k is yellow
$v is 20
==========


Thread Previous | Thread Next


Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About