0

在 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,name2和name3,name7,name8和name9。

有任何想法吗?

4

2 回答 2

3

您将@$rows+1在 while 循环的每次迭代中重新开始计数。尝试:

 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,
             }             
        );                
    }                     
}    
于 2013-08-30T07:20:53.387 回答
0

每次 for 循环结束时,$i 都会重置为相同的数字 $rows。因此,每次 for 循环结束时,您都必须保存 $i。

于 2013-08-30T08:56:33.283 回答