given ($hash{'eventName'}) { when ('AudioLevel') {...} ... } #### my %keys = ( AudioLevel => [qw(StreamNumber StreamPosition AudioLevel)], Phoneme => [qw(StreamNumber StreamPosition Duration NextPhoneId Feature CurrentPhoneId)], # ... ); if ($keys{$hash{'eventName'}}) { @hash{@{$keys{$hash{'eventName'}}}} = @_[2..$#_]; } else { die "unknown event $hash{'eventName'}"; } #### my %keys = ( ... Viseme => [ qw(StreamNumber StreamPosition Duration), { NextVisemeId => sub { DecodeSpeechVisemeType($_[5]) }, Feature => sub { DecodeSpeechVisemeFeature($_[6]) }, CurrentVisemeId => sub { DecodeSpeechVisemeType($_[7]) } ], ... ); if ($keys{$hash{'eventName'}}) { my @keys = @{$keys{$hash{'eventName'}}}; my $dynamic_keys = ref $keys[-1] ? pop @keys : {}; @hash{@keys} = @_[2..$#keys+2]; for my $dyn (keys %$dynamic_keys) { $hash{$dyn} = $dyanmic_keys->{$dyn}->(@_); } } else { die "unknown event $hash{'eventName'}"; }