Not bad for a first program ... here is a less redundant
version in the interest of helping you learn more:
#!/usr/bin/perl -w
use strict;
my $beer = abs shift || 99;
print how_many($beer), ",\n",
how_many($beer), ".\n",
"Take one down, pass it around,\n",
how_many(--$beer), ".\n\n"
while $beer;
sub how_many {
my $numb = shift;
return $numb
. ' bottle'
. ($numb == 1 ? '' : 's')
. ' of beer on the wall'
;
}
Instead of asking the user for the number of beers *hic*,
the code instead gets the number as a command line
argument. If no argument is supplied, it instead uses a
default value of 99. Also, it counts down until $beer is
a false value instead of until $beer is 0 - hence, we have
to take the absolute value of that command line argument
lest the user give us a negative value and spin us off into an infinite loop. This version also
uses a subroutine and a ternary operator (expr ? true : false), which is just a fancy if-else that
is used to avoid spouting out '1 bottles'.
Keep on coding! :)
UPDATE: oops, you are correct mystik - and yes, my
vision was blurry last night! :D (typo corrected)
jeffa
L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)
| [reply] [Watch: Dir/Any] [d/l] |
I'm pretty sure that you need to change how_many($beer--) to how_many(--$beer). After you take one down, and pass it
around, unless your vision is blurrey, there's one fewer beer.
For the benefit of those that don't know, $var-- returns the value of $var, then decrements it. --$var first decrements, then returns $var
If the eval engine in my brain is correct, --$var++ will return $var - 1, but the value of $var will still be the same ;)
| [reply] [Watch: Dir/Any] |
Getting rid of the warning and making it just a little bit prettier:
#!/usr/bin/perl -w
use strict;
use Lingua::EN::Nums2Words;
my $beer = shift || 99;
$beer = abs($beer);
print how_many($beer), ",\n",
how_many($beer), ".\n",
"Take one down, pass it around,\n",
how_many(--$beer), ".\n\n"
while $beer;
sub how_many {
my $numb = &num2word(shift);
$numb =~ s/(\w)(.*)/\u$1\L$2/;
return $numb
. ' bottle'
. ($numb eq 'One' ? '' : 's')
. ' of beer on the wall'
;
}
Requires Lingua::EN::Nums2Words.
()-()
\"/
`
| [reply] [Watch: Dir/Any] [d/l] |
Here's the first joke that I can remember telling as a kid. It still cracks em up today.
#!/usr/bin/perl -w
use strict;
use Lingua::EN::Nums2Words;
my $beer = shift || 99;
$beer = abs($beer);
for (-9..$beer) {
print how_many($beer), ",\n",
how_many($beer), ".\n",
"Take one down, pass it around,\n",
how_many(--$beer), ".\n\n"
}
sub how_many {
my $numb = &num2word(shift);
$numb =~ s/(\w)(.*)/\u$1\L$2/;
return $numb
. ' bottle'
. ($numb eq 'One' ? '' : 's')
. ' of beer on the wall'
;
}
()-()
\"/
`
| [reply] [Watch: Dir/Any] [d/l] |
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__
| [reply] [Watch: Dir/Any] [d/l] |