Perlで返り値を安易に補完しない方が良かった話

@nqounetです。

何故か変にはまってしまったことがあったので、またうっかりしないようにメモしておきます。

配列を返すメソッドを呼ぶ時に、安全策のつもりでこんな感じで書いてました。

1
my @array = $self->array || ();

$self->array が失敗した時に空の配列にしたかったのですが、これが罠でした。

以下のコードを実行してみるとどのようになるでしょうか?

1
2
3
4
5
6
7
sub array {
    my @array = (1, 2, 3);
    return @array;
}

my @array = array() || ();
print "@array";

実行すると、画面に表示されるのは 3 になります。

1
2
3
4
5
6
7
sub array {
    my @array = (1, 2, 3);
    return @array;
}

my @array = array();
print "@array";

安易に補完せず、このように書くと 1 2 3 という表示になります。

配列を期待しているところでは、返り値だけでなく、返り値がなかった時の対策についてもちゃんと考えておきましょう。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy