Every time I take a slice of a hashref I have to reteach myself the syntax. I usually do that using the debugger. I often spend way too long with the task, taking wrong turns and confusing myself to no end.
Today I noticed that this works in the debugger:
DB<1> $r = {this => 'that', these => '17'}
DB<2> @f = qw(this these)
DB<3> x {%$r}{@f}
0 'this'
1 'these'
The debugger's x command outputs this construction just fine. Yet when I try to assign the results of this expression to an array, either in the debugger or in a program, I get an error:
DB<4> @i = {%$r}{@f}
syntax error at (eval 32)[/usr/local/perl/5.10.0/lib/5.10.0/perl5db.pl:638] line 2, near "}{"
The correct syntax is:
@i = @{$r}{@f};
Hopefully I won't have to figure it out from scratch again the next time.
array (Score:0)
Re: (Score:2)
You're right. I'm getting keys, not values. I should pay more attention to detail. :)
So what about the debugger is making it ignore the first part in braces, I wonder.
J. David works really hard, has a passion for writing good software, and knows many of the world's best Perl programmers
My way of rembering it... (Score:1)
This might not help, but I remember hash slices as follows. First really it's just a hash:
Second we do our lookup:
Slices return lists, so we need an @ sign instead of the %:
Which gives us:
You can go the other di
Parsed as blocks (Score:1)
The expression you're supplying to the debugger is being parsed as a block:
tony@zeus:~$ perl -MO=Deparse -e '{%$r}{@f}'{
%$r;
}
{
@f;
}
-e syntax OK
eval()ling the same expression gives the result you saw in the debugger:
tony@zeus:~$ perl -e '$r = { this => "that", these => 17 }; @f = qw(this these); @foo = eval q"{%$r}{@f}"; use Data::Dumper; print Dumper \@foo'
$VAR1 = [
'this',
Re: (Score:2)
Ah! Thank you for the explanation!
J. David works really hard, has a passion for writing good software, and knows many of the world's best Perl programmers