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'}";
}