A simplification of your code. You are repeating the same action using different data. So rather than have lots of code lets focus on a data structure that uses the same code.
my %effects = (
part => [qw(acid cold electricity fire)],
gaze => [qw(paralysis stone stun death)],
range_part => [qw(gas sonic)],
touch_part => ['poison', 'energy drain'],
touch_special => ['befouls', 'purifies', 'nullifies holy water', 'nu
+llifies unholy water'],
vocal => [qw(deafen fear terror flight)],
);
$effects{'range'} = [@{$effects{'part'}}, @{$effects{'range_part'}}]
+;
$effects{'touch'} = [@{$effects{'part'}}, @{$effects{'touch_part'}}]
+;
$effects{'general'} = [@{$effects{'part'}}, @{$effects{'touch_part'}},
@{$effects{'gaze'}}, @{$effects{'range_part'}},
@{$effects{'vocal'}}];
sub random_effect {
my $type = shift;
return 'unknown' if not exists $effects{ $type };
return $effects{ $type }[ rand @{$effects{ $type }} ];
}
print random_effect('misspelled') . "\n";
print random_effect( 'touch' ) . "\n";
print random_effect( 'touch' ) . "\n";
print random_effect( 'general' ) . "\n";
print random_effect( 'general' ) . "\n";
Now if you want to add a effect type, you only need to add an entry into %effects. You could probably do something similar for the alignments.