\@と\()は違うので
気をつけましょうというメモ。
下の二つは同じだと思っていた。
#!/usr/local/bin/perl # ref_test1.pl use strict; use warnings; use 5.010; use Data::Dumper qw(Dumper); { my @arr = (1, 2, 3, 4); my $arr_ref = \@arr; print Dumper($arr_ref); } { my $arr_ref = \(1, 2, 3, 4); print Dumper($arr_ref); } __END__
実行。
$ ./ref_test1.pl $VAR1 = [ 1, 2, 3, 4 ]; $VAR1 = \4;
つつつまり、こういうことか。
my $arr_ref = \(1, 2, 3, 4); # ↓ my $arr_ref = (\1, \2, \3, \4);
なので最後の「\4」が$arr_refに入ると。
書き換えるとこうかな。
#!/usr/local/bin/perl # ref_test2.pl use strict; use warnings; use 5.010; use Data::Dumper qw(Dumper); { # my $arr_ref = \(1, 2, 3, 4); my $arr_ref = (\do{my $i = 1}, \do{my $i = 2}, \do{my $i = 3}, \do{my $i = 4}, ); print Dumper($arr_ref); } __END__
$ ./ref_test2.pl Useless use of reference constructor in void context at ./ref_test2.pl line 13. Useless use of reference constructor in void context at ./ref_test2.pl line 13. Useless use of reference constructor in void context at ./ref_test2.pl line 13. $VAR1 = \4;
ちなみにというか、「\4」その他は正規表現の後方参照とは全く関係なく、ただの数値リテラルのリファレント。
say $$arr_ref; #=> 4