And here's a different way:
#!/usr/bin/perl
use strict;
use warnings 'all';
use Lingua::EN::Inflect;
my $beer = abs (shift || 99);
sub UNIVERSAL::TIEHASH {bless [] => shift}
sub UNIVERSAL::FETCH {no strict 'refs';
&{"Lingua::EN::Inflect::" . ref $_ [0]}
(split /$;/ => $_ [
+1])}
tie my %N => 'NUMWORDS';
tie my %B => 'PL';
print <<"--" while $beer;
\u$N{$beer} $B{bottle => $beer} of beer on the wall,
$N{$beer} $B{bottle => $beer --} of beer.
Take one down,
pass it around.
\u$N{$beer} $B{bottle => $beer} of beer on the wall.
--
package NUMWORDS;
package PL;
__END__