#
# One more approach is to use the array/hash conversion rules to
# build keyword parameters, with defaults.
#

use strict;

# Print a string one or more times under all sorts of controls.
sub barko {
    # Check for correct pairing.
    @_ % 2 == 0 or
	die "barko: Odd number of arguments.\n";

    # Store the parms, with defaults.
    my %parms = ( 'string' => 'snake',  # String to print
		  'between' => '',	# Place between chars.
		  'repeat' => 1,	# Repeat this many times.
		  'cascade' => 0,	# Move each line right this much more.
		  'blankafter' => 1,	# Extra blank line afterwards.
		  @_);
    # Now %parms is a list of keyword => value pairs as sent, using
    # defaults for keys not sent.

    # Add the between to the string.
    my $str = substr($parms{'string'}, 1);
    $str =~ s/(.)/$parms{'between'}$1/g;
    $str = substr($parms{'string'}, 0, 1) . $str;

    # Printin' time!
    my $preamt = 0;
    for(my $n = $parms{'repeat'}; $n--; ) {
	print ((' ' x $preamt), "$str\n");
	$preamt += $parms{'cascade'};
    }
    print "\n" if $parms{'blankafter'};
}

# Call with various options.  These can be sent in any order.
barko;
barko(repeat => 3, string => 'BOZON', cascade => 1);
barko(between => ' ');
barko(between => '<->', repeat => 5);
barko(string => '** done **', blankafter => 0);

