Perlの波括弧の前に付いてるプラスの話

Perlのリファレンスperldoc.jpを読むと良いと思う。

例えば、こんなコード。

use strict;
use warnings;
use v5.10;

use Data::Dumper;

my @foo = qw/a b c d e/;
my @bar = map { $_ x 3; } @foo;

say Dumper( \@bar );

実行すると、こんな感じ。
$ perl aaa.pl
$VAR1 = [
'aaa',
'bbb',
'ccc',
'ddd',
'eee'
];

なんのことはないですね。
x(繰り返し演算子)という演算子を初めて見たとかはあるかも知れませんが。

じゃぁ、今度はこれ。

use strict;
use warnings;
use v5.10;

use Data::Dumper;

my @foo = qw/a b c d e/;
my @bar = map {
    my $n = ord $_;
    { $_ => $n };
} @foo;

say Dumper( \@bar );

ordは、最初の文字を数字にして返す関数です。
予想通りですか?
$ perl bbb.pl
$VAR1 = [
'a',
97,
'b',
98,
'c',
99,
'd',
100,
'e',
101
];

あれあれ?って思った方は鋭いですね。
でもって次は、波括弧の前にプラスを付けてみます。

use strict;
use warnings;
use v5.10;

use Data::Dumper;

my @foo = qw/a b c d e/;
my @bar = map {
    my $n = ord $_;
    +{ $_ => $n };
} @foo;

say Dumper( \@bar );

今度はどうでしょうか?
$ perl ccc.pl
$VAR1 = [
{
'a' => 97
},
{
'b' => 98
},
{
'c' => 99
},
{
'd' => 100
},
{
'e' => 101
}
];

やっと思った通りに動きました。
=>はカンマの類いなので、リスト(配列?)が返ることによって、
“bbb.pl”のような挙動になったと推測されます。(*1)

でも、次のコードだと・・・?

use strict;
use warnings;
use v5.10;

use Data::Dumper;

my @foo = qw/a b c d e/;
my @bar = map {
    { $_ => ord $_ };
} @foo;

say Dumper( \@bar );

あれあれ?
$ perl ddd.pl
$VAR1 = [
{
'a' => 97
},
{
'b' => 98
},
{
'c' => 99
},
{
'd' => 100
},
{
'e' => 101
}
];

まとめ

人間にも、Perlにも、ハッシュリファレンスなのか、ブロックなのか分からないので、
+{...}のように、ハッシュリファレンスであることを明示的に記述すると、
人間にも、Perlにも、ハッシュリファレンスだと判別できて良いですね。

という訳で、検証コード。

use strict;
use warnings;
use v5.10;

sub foo {
    my ( $n, $m ) = @_;
    $n, $m;
}

sub bar {
    my ( $n, $m ) = @_;
    {
        $n, $m
    }
}

sub hoge {
    my ( $n, $m ) = @_;
    +{
        $n, $m
    };
}

say join " - ", foo( 1, 2 );
say join " - ", bar( 1, 2 );
say join " - ", hoge( 1, 2 );

これを実行すると、こんな感じ。
$ perl eee.pl
1 - 2
1 - 2
HASH(0x7fea130052b8)

おしまい。

(*1) コンマ演算子(perldoc.jp)を参照

Leave a Comment