#!/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