無名ハッシュコンストラクタのブレースの前に+を付けないといけないケース

気になったので調べてみた。
perlrefを見れば一発だった。

そもそも+を付けるって何

中かっこは、BLOCK を始めとして他のことにも使われますから、 開きの中かっこが BLOCK の開始でないことを Perl に教える ために文の最初の中かっこの前に + や return をつけて、 曖昧さをなくすようにする必要がある場合があります。

perlref - Perlのリファレンスとネストしたデータ構造 - perldoc.jp

どんなときに+を付けないといけないのか

perlrefのサンプルそのままなんだけど一応。

# sample.pl
use strict;
use warnings;
use Data::Dumper;

sub hashem
{
    { @_ };    # ハッシュリファレンスを返したい
}

print Dumper hashem( qw/ a 1 b 2 / );
$ perl sample.pl
$VAR1 = 'a';
$VAR2 = '1';
$VAR3 = 'b';
$VAR4 = '2';

ハッシュリファレンスを返すつもりが、配列が返される。


では、+を付けて実行すると

use strict;
use warnings;
use Data::Dumper;

sub hashem
{
    +{ @_ };    # ハッシュリファレンスを返したい
}
print Dumper hashem( qw/ a 1 b 2 / );
$ perl sample.pl
$VAR1 = {
          'a' => '1',
          'b' => '2'
        };

想定通りに、ハッシュリファレンスが返される。
なるほど、納得!