# FizzBuzz by code reference. (Without decision logic!!!)
# First, take a fresh array. Be sure to wash it thoroughly to remove any dirt and residue.
# Next, add in four code references, like so:
@a=(
sub {print "FizzBuzz\n"},
sub {print "Buzz\n"},
sub {print "Fizz\n"},
sub {print "$_[0]\n"}
);
# Set the array aside.
# Next, take a list of numbers (from 1 to 100)
# Then, take two "<=>" (spaceship operators) and two 0s
# Combine them with each test value to produce two new values (1 or 0 for each new value).
# The two values are the "multiple of 3 test result" and the "multiple of 5 test result."
# Spice up the "multiple of 5 test result" by multiplying it by 2.
# Mmmmm. . . Spicy!
# Combine the fresh test results to come up with a new value that is
# specific to the properties of the original value.
# A value that is a multiple of 3 and 5 will get a combined test value result of 0.
# A value that is a multiple of 5 will get a combined test value result of 1.
# A value that is a multiple of 3 will get a combined test value result of 2.
# A value that is not a multiple of 3 and 5 will get a combined test value result of 3.
# Take the piping hot test value result and use it as an index for the array of code references.
# Be sure to pass the original value through the array for the times when the code reference
# at $a[3] is called!!!
$a[($_%3<=>0) + (2*($_%5<=>0))]->($_) for (1..100)
# And, would you look at that!? Each code reference prints out
# "FizBuzz," "Buzz," "Fizz," or the original value
# based on that crunchy-on-the-outside, tender-in-the-middle
# combined test result!