28880


Perl のリストをリファレンスにするときには、`\`を使うと思います。

[code]

    125> my @list = (1..3);
    $res[75] = [
      1,
      2,
      3
    ]
    
    126> my $x = \@list;
    $res[76] = [
      1,
      2,
      3
    ]
    
[/code]

しかし、map の場合は、`\`が使えない(?) ので、`[]`を使っています。

[code]

    134> my $x = \map { $_ } @list;
    $res[84] = \3
    
    135> my $x = \{ map { $_ } @list };
    Odd number of elements in anonymous hash at reply input line 1.
    $res[85] = \{
        '1' => 2,
        '3' => undef
      }
    
    136> my $x = [ map { $_ } @list ];
    $res[86] = [
      1,
      2,
      3
    ]
    
[/code]

いろいろ覚えたくないので、  
「`\`を使わず、常に`[]`を使えば良いのでは?同じことできるし」、  
と思ったのですが、  
この2つには、何か違いがあるのでしょうか?

[code]

    143> my $x = [@list];
    $res[89] = [
      1,
      2,
      3
    ]
    
[/code]

[perlref - perldoc.perl.org](http://perldoc.perl.org/perlref.html#Making-
References)

によると、

> A reference to an anonymous array can be created using square brackets:

ということなので、  
`@list` が展開できるのは、本来の使い方ではない、ということでしょうか?

(資料が少なくて探しづらいので、検索キーワードをいただけるだけでも助かります)


CC BY-SA 3.0
2016-09-14T09:20:14.590
28878
2016-09-14T14:56:18.427
7471
question
perl
Perl の \@list と [@list] には、どんな違いがありますか?


今回のmapのような場面で`[]`を使ったとしても、間違いとは言い切れないと思います。

`\`と`[]`の違いですが

  * `\`はご存知の通り **リファレンスを作り出します** 。
  * `[]`は **無名配列を作り出しそのリファレンスを返してくれます** 。

`\`はなにも`配列へのリファレンス`を作り出すためだけに使用するものではありません。  
`スカラーへのリファレンス`、`配列へのリファレンス`、`ハッシュへのリファレンス`というように使えます。

`スカラーへのリファレンス`の一種ですが、下記のように`リファレンスのリファレンス`も作れます。

[code]

    my @list = 1..3;
    my $x = \\@list;
    print join ',', @$$x;
    
[/code]

なので適切に使い分ける必要があり、常に`[]`が使えるわけではありません（`なにかのリファレンス`が欲しい場合は`\`を使う必要があるわけですから）。

さらにmapで`\`がうまくいっていないことに関して説明を付け加えると、

> `my $x = \map { $_ } @list;`

動作から map以下の部分がスカラーコンテキストとして評価されているのがわかります。

> `my $x = \{ map { $_ } @list };`

`{}`は無名ハッシュを作りだします。なので無名ハッシュのリファレンスのリファレンスを作り出そうとしてます。エラーの内容もそのような内容です（リファレンス以前の問題で、ハッシュを作ろうとしているのに要素数が奇数なので変ですというエラーですが）。

さて

> `my $x = [ map { $_ } @list ];`

がうまくいっている理由ですが

`my $x = [リストコンテキスト]` となり、うまくいっていると動作からわかります。  
「単純にリファレンスが欲しい」、「リストコンテキストとして評価してもらいたい」、「ソースを読みやすくしたい」などに応じて`\`,`[]`を使い分けることになると思います。

さらに付け加えます(<https://ja.stackoverflow.com/a/28884/9008> を拝見して思い出しました)。  
`[@list]`とした場合は、`@list`と`無名配列`の２つ同じ中身のデータ（複製のようなもの）がメモリ上にできあがるはずです。
`\@list`は無名配列を作らないので必要な配列はメモリ上にひとつだけで無駄がないでしょう。


CC BY-SA 3.0
2016-09-14T10:32:51.610
28880
2016-09-14T14:56:18.427
2017-04-13T12:52:39.113
-1
9008
28878
answer


\@list は 変数 @list のリファレンスですが、[@list] は @list
を展開したリストを格納する無名配列のリファレンスです。無名配列は不要になれば消されるので、見掛けが同じでも無名配列まで同じとは限りません。確かめるとき
print 文は如何でしょう。

[code]

    my @list = 1..3;
    print \@list,   "\n" for 1..3;
    print [@list],  "\n" for 1..3;
    print +{@list}, "\n" for 1..3;
    
[/code]


CC BY-SA 3.0
2016-09-14T13:34:26.053
28884
2016-09-14T13:34:26.053
18788
28878
answer