在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。
有什么想法吗?
答案 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。