Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

(jeffa) Re: 99 bottles of beer on the Wall

by jeffa (Bishop)
on Aug 21, 2002 at 04:35 UTC ( #191653=note: print w/ replies, xml ) Need Help??


in reply to 99 bottles of beer on the Wall

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)


Comment on (jeffa) Re: 99 bottles of beer on the Wall
Download Code
Replies are listed 'Best First'.
Re: (jeffa) Re: 99 bottles of beer on the Wall
by mystik (Sexton) on Aug 21, 2002 at 12:33 UTC

    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 ;)

Re: 99 bottles of beer on the Wall
by Abigail-II (Bishop) on Aug 21, 2002 at 13:11 UTC
    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__
Re: (jeffa) Re: 99 bottles of beer on the Wall
by ignatz (Vicar) on Aug 21, 2002 at 13:24 UTC
    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.
    ()-()
     \"/
      `                                                     
    
      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' ; }
      ()-()
       \"/
        `                                                     
      

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://191653]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (8)
As of 2015-07-30 00:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (269 votes), past polls