my %phrases = ( "phrase 1" => { qty => 1, qtySum => 5, qtyCont => 8, }, "phrase 2" => { qty =>10, qtyCont =>34, }, "phrase 3" => { qty =>1, }, ); for my $k (keys %phrases) { # update # $phrases{$_}->{ qtyTotal} = sub { qtyTotal($_) } $phrases{$k}->{ qtyTotal} = sub { qtyTotal($k) } } sub qtyTotal{ my $qty = 0; my $key = shift; my $phObj = $phrases{$key}; foreach my $qType ('qty', 'qtySum', 'qtyCont'){ $qty += $phObj->{$qType} if exists $phObj->{$qType}; } return $qty; }