Почему `a :: -> func;` допустим? - PullRequest
       1

Почему `a :: -> func;` допустим?

16 голосов
/ 05 сентября 2011
package a;
sub func {
print 1;
}
package main;
a::->func;

ИМО достаточно иметь a::func, a->func.

a::->func; выглядит очень странно для меня, почему Perl поддерживает этот странный синтаксис?

Ответы [ 2 ]

25 голосов
/ 05 сентября 2011

Процитирую превосходное недавнее сообщение в блоге chromatic на тему Современный блог Perl : "Чтобы избежать двусмысленности при разборе голого слова".

Чтобы проиллюстрировать, почему такой синтаксис полезен, вот пример, разработанный на вашем примере:

package a;
our $fh;
use IO::File;
sub s {
    return $fh = IO::File->new();
}

package a::s;
sub binmode {
    print "BINMODE\n";
}

package main;
a::s->binmode; # does that mean a::s()->binmode ?
               # calling sub "s()" from package a; 
               # and then executing sub "open" of the returned object?
               # In other words, equivalent to $obj = a::s(); $obj->binmode();
               # Meaning, set the binmode on a newly created IO::File object?

a::s->binmode; # OR, does that mean "a::s"->binmode() ?
               # calling sub "binmode()" from package a::s; 
               # Meaning, print "BINMODE"

a::s::->binmode; # Not ambiguous - we KNOW it's the latter option - print "BINMODE"
9 голосов
/ 05 сентября 2011

a:: - строковый литерал, который создает строку a.Все то же самое:

 a->func()    # Only if a doesn't exist as a function.
 "a"->func()
 'a'->func()
 a::->func()
 v97->func()
 chr(97)->func()

и т. Д.

>perl -E"say('a', a, a::, v97, chr(97))"
aaaaa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...