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