Perl日記

PerlとかRubyとかPHPとかPythonとか

\@と\()は違うので

気をつけましょうというメモ。
下の二つは同じだと思っていた。

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