use Foo () としたときFoo->importが呼ばれないのはなぜか

perl5の話題。

use FooとするとFooをrequireしつつ、Foo->importが呼ばれることはよく知られているが、 use Foo ()としたときには、importは呼ばれない。

これをどういう風にして実現しているのか前から疑問に思っていた。 というのも普通の関数は「引数なし」と「空リストの引数」を区別できないからだ。

perlのソースコードをみたところ、 parseのところで「引数なし」と「空リストの引数」を区別しているとわかった。

https://github.com/Perl/perl5/blob/v5.24.0/op.c#L6048

https://github.com/Perl/perl5/blob/v5.24.0/perly.y#L346-L354

追記