evaluation
- ref:http://d.hatena.ne.jp/mono-hate/20080709/1215621965
- ref:http://d.hatena.ne.jp/mono-hate/20080708/1215534623
{と}の間はカンマを特別に評価しているようなので,特別な評価になるのでしょうか.
評価が特別というより、単に bareword が使えるとかそういう話な気が。
さて、以下のスクリプトの実行結果はどうなるだろうか。実行しないで全部わかった人は結構すごいと思う。
use strict; use warnings; use English; use Dumpvalue; use constant { a => 'c', b => 'd', }; $SUBSEP = '/'; our %hash = (a => 1, b => 2, c => 3, d => 4, 1 => 5, 2 => 6); $hash{'a', 'b'} = 7; $hash{'c', 'd'} = 8; my ($a, $b) = qw(c d); our @array = 0..9; sub eval_and_print { no warnings qw(syntax void); my $exp = shift; my @a; my $s; printf "%-24s: ", $exp; print join(', ', eval $exp), $/; } sub main { my $dumper = Dumpvalue->new; $dumper->veryCompact(1); $dumper->dumpvars('main', qw(array hash)); eval_and_print(q(@array[5])); eval_and_print(q(@array[5, 7])); eval_and_print(q($array[5])); eval_and_print(q($array[5, 7])); eval_and_print(q($s = @a = @array[5])); eval_and_print(q($s = @array[5])); eval_and_print(q($s = @a = @array[5, 7])); eval_and_print(q($s = @array[5, 7])); eval_and_print(q(@hash{a})); eval_and_print(q(@hash{qw(a b)})); eval_and_print(q(@hash{qw(a b)})); eval_and_print(q(@hash{a, b})); eval_and_print(q($hash{qw(a b)})); eval_and_print(q($hash{a, b})); eval_and_print(q($hash{@a = qw(a b)})); eval_and_print(q($hash{do { qw(a b) }})); } main if $0 eq __FILE__;