Perl:一种将哈希作为输入并迭代值和键的函数

时间:2013-08-30 07:03:58

标签: perl

在Perl中,如何创建一个将哈希作为输入并迭代值和键的函数?

例如,假设我有这个可爱的输入

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

其中Role-> {Dog}是唯一常量。把它们想象为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,当循环转到cat时,当它们被称为name1,name8和name9时,它们再次被称为name1,name2和name3。

有什么想法吗?

2 个答案:

答案 0 :(得分: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,
             }             
        );                
    }                     
}    

答案 1 :(得分:0)

每次你的for循环结束时,$ i被重置为相同的数字$ rows.So,你必须在每次for循环结束时保存$ i。