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