#!/usr/bin/perl
# --------------------------------------------------------
# I hate Perl's syntax for scalars vs arrays vs hashes and
# all of the nasty tricks in between for referencing them.
#
# I want to iterate over a hash table of arrays and then
# pass each array to a function.
# --------------------------------------------------------
# From the Camel Book:
%HoA = (
flintstones => [ "fred", "barney" ],
jetsons => [ "george", "jane", "elroy" ],
simpsons => [ "homer", "marge", "bart" ],
);
# Here's the book's way to loop through this:
for $family ( keys %HoA ) {
print $family . ": ";
for $i ( 0 .. $#{ $HoA{$family} } ) {
print $HoA{$family}[$i] . " ";
}
print "\n";
}
# If I want to grab each array that comes out I need to
# deference it with {} and declare it an an array with @
# I can't just say: @fam_arr = @HoA{$family};
# So for the array that comes out which I refer to as
# a scalar, I'm now going to refer to as an array:
foreach $family ( keys %HoA ) {
@fam_arr = @{ $HoA{$family} };
print $family . ": ";
foreach $name (@fam_arr) {
print $name . " ";
}
print "\n";
}
# Since Perl's parameter passing to functions expands arrays
# into all of their values, I need to be explicit when I pass
# the array that I'm passing a reference to the array with \@
# The function then takes the scalar reference and I then tell
# it to deference it with {} and treat it as an array with @
foreach $family ( keys %HoA ) {
@fam_arr = @{ $HoA{$family} };
print $family . ": ";
print_list(\@fam_arr);
print "\n";
}
sub print_list {
my ($fam_arr) = @_;
foreach $name (@{$fam_arr}) {
print $name . " ";
}
}
# I find this to be excessive compared to similar languages.
# Perhaps I don't know a better way with Perl or this is just
# not a paradigm Perl promotes. I'm trying to abstract some
# things to shift focus away from what I want to do to each
# array in a real program and I've done it, but I feel I had
# to introduce what seems like some ugly reference tricks.
Tuesday, August 21, 2007
Perl array references... yuck
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment