今日、ちょっとだけビックリしたことメモ。

こんな感じ(↓)の物体を書いてたんだけど、

#!/usr/bin/perl
use strict;
use warnings;
use feature qw(say);

my @aaa = '';

push @aaa, 'something1';
push @aaa, 'something2';
say join ',', @aaa;

これ、出力どうなると思います?ってか、そもそもコンパイル通るとおもいます?

結果

tsucchi@immature[522]$ perl a.pl
,something1,something2

なんとびっくり(あれ?頭にカンマついてるぞ、なんだこれ?)

my @aaa = '';

my @aaa = ('');

として解釈されてるっぽいんですよね。Deparse かけると、

my(@aaa) = '';

となっていた。うーん、良く分からん。

まああんま気にしなくてもいいのかもしれないけど、@aaa 相当の物体は、元々 scalar で、「あれ?やっぱ配列じゃね?」と思って書き換えたら、こんな感じでミスったのでした。気をつけよう。。。

追記

スカラ値をリストコンテキストで評価すると要素一つのリストになるので、@a = ('') と解釈されるんですよ。

むー、そういうことか。やっぱ罠だなー。。。

追記2

ですね。戻り値の時は意識してたけど、代入の時は考慮してなかった。。。



blog comments powered by Disqus