wantarrayは演算子?それとも関数?

とある古いPerlの本を読みながらlocalの記述だったり、
いろんなTipsを読んで復習していたら、いろんな発見があって勉強になった。

ちなみに、とある古い本とは以下の本で、
この本では、「wantarray演算子」って記述されてた。

結論から言うと、どっちでも良くて、
sub foo {...}は、foo();でも、foo;でも呼べるし、
wantarrayをMacのターミナルで調べる時は、
$ perldoc -f wantarray
だし、
wantarray – perldoc.jpでは関数扱いだし、
多数決で関数ってことでいんじゃないですかね。

あ、じゃぁ、自分は演算子に1票入れるので、
どっち付かずということで。

と、まぁ、冗談はさておき、sub foo {...}foo;で呼ぶには条件があって、
foo;で呼ぶ場合は、すでに定義されている必要がある。

use strict;
use warnings;

sub foo {
    return 1;
}

print foo, "\n";
print foo(), "\n";

結果は、この通り問題ない。
$ perl aaa.pl
1
1

これならどうだろう?

use strict;
use warnings;

print foo(), "\n";

sub foo {
    return 1;
}

もちろん、大丈夫。
$ perl bbb.pl
1

じゃぁ、これは?

use strict;
use warnings;

print foo, "\n";

sub foo {
    return 1;
}

これは条件を満たしてないのでダメ。
$ perl ccc.pl
No comma allowed after filehandle at ccc.pl line 4.

という訳で、好きなように書いても良いけど、
foo;みたいな書き方は、先に定義されてないとダメだよ、ってお話でした。

おしまい。

Leave a Comment