| [reply] [d/l] |
Dear Monks,
Thanks for all your suggestions. I appreciate the time taken to help out. The Perl community really is the best!
I figured it out, this is all I needed to get my code to execute correctly.
foreach my $val (keys ${\( STUFF() ) } ){
my $subroutine = ${\( STUFF() ) }->{ $val };
my $value = $self->xml()->$subroutine();
}
| [reply] [d/l] |
Why not
my $subroutine = STUFF->{ $val }
?
| [reply] [d/l] |
Doh, yea you're right. That's all that's needed. Thx
| [reply] |
foreach my $val (keys ${\( STUFF() ) } ){ ... }
Here, keys is iterating over a hash reference. Quoth the docs (from 5.14):
Starting with Perl 5.14, "keys" can take a scalar EXPR, which
must contain a reference to an unblessed hash or array. The
argument will be dereferenced automatically. This aspect of
"keys" is considered highly experimental. The exact behaviour
may change in a future version of Perl.
And indeed, this feature was tried, found wanting, and finally cast into Outer Darkness with Perl version 5.24. (And similarly for values, each, push, pop and, I think, some others.) See also Postfix Dereference Syntax and circumfix dereference syntax, discussed therein.
c:\@Work\Perl\monks>perl -wMstrict -le
"print qq{perl version: $] \n};
;;
use constant {
STUFF => {
'bizz' => 'foe',
'bazz' => 'fie',
'bozz' => 'fee',
},
};
print ${\( STUFF() ) };
print STUFF;
;;
foreach my $val (keys ${\( STUFF() ) } ){
my $subroutine = ${\( STUFF() ) }->{ $val };
print qq{A: '$val' -> '$subroutine'};
}
;;
for my $k (keys %{ STUFF() }) {
my $value = STUFF->{$k};
print qq{B: '$k' -> '$value'};
}
"
perl version: 5.014004
HASH(0x4340ac)
HASH(0x4340ac)
A: 'bozz' -> 'fee'
A: 'bazz' -> 'fie'
A: 'bizz' -> 'foe'
B: 'bozz' -> 'fee'
B: 'bazz' -> 'fie'
B: 'bizz' -> 'foe'
(The circumfix dereference syntax is more widely supported — and I can't give an example of postfix dereference syntax anyway!)
Give a man a fish: <%-{-{-{-<
| [reply] [d/l] [select] |