2013-08-30 51 views
0

在Perl中,如何創建一個函數,將哈希作爲輸入並遍歷值和鍵?Perl:將哈希作爲輸入並遍歷數值和鍵的函數

例如,說我有這個可愛的輸入

 my %role2numbers = (Role->{Dog} => 6, 
          Role->{Cat} => 3, 
          Role->{Mouse} => 1,); 

其中role - > {}狗是唯一的常數。把它們當作1,2和3

而且這種方法:

sub make_zoo{ 
    my %number_members_for_role = @_;   
    my $database_operation = SomeDBIModule::Table->new(); 
    my $rows = $database_operation->select(); 

    while (my ($role, $num) = each %number_members_for_role) { 
     for my $i (@$rows + 1 .. @$rows + $num) { 
      $database_operation->insert(
       +{ zoo_id   => 1, 
        name   => "name".$i, 
        type   => $role, 
       }    
      );     
     }      
    }       

} 

但是當我做

 make_zoo (%role2numbers); 

它不會產生我想要的。

它增加了6只狗,3只貓和1只老鼠。但是這些狗被稱爲name1,name2,name3,name4,name5,name6,當循環進入貓時,貓應該被稱爲name1,name2和name3,name7,name8和name9。

任何想法?

+2

這*應該*正常工作。你爲什麼不在循環內打印'$ num','$ i'和'$ role'的值,看看你的假設是否正確? – amon

+0

@amon對不起,它工作正常。問題實際上是名字重複。 name1,name2,name3,name4,name5,name6,然後當它進入貓,name1再... – ado

+0

@amon我編輯的問題。 – ado

回答

3

在while循環的每次迭代中,您正在重新啓動計數@$rows+1。嘗試:

my $i = @$rows; 
while (my ($role, $num) = each %number_members_for_role) { 
    for my $role_num (1 .. $num) { 
     $database_operation->insert(
      +{ zoo_id   => 1, 
       name   => "name".++$i, 
       type   => $role, 
      }    
     );     
    }      
}  
0

您的每一次for循環結束時,$ i恢復爲相同數量的$ rows.So,你必須拯救我每天在for循環結束時$。