2011-09-05 14 views
16
package a; 
sub func { 
print 1; 
} 
package main; 
a::->func; 

IMOそれで十分ですa::funca->funcです。`a :: - func;`はなぜ有効ですか?

a::->func;私は非常に奇妙に見えますが、なぜPerlはこのような変な構文をサポートしていますか?

+5

... –

+9

Perlはな理由や言い訳もないが必要です。 PerlはPerlです。 –

+0

@pst - 私は見知らぬ人を提示するつもりです:) – DVK

答えて

25

Modern Perl blogのトピックに関するクロマティックの優れた最近のブログ記事を引用すると、「bareword parsing ambiguityを避ける」このような構文が有用である理由を説明するために

は、ここにあなたのサンプルから進化した例です:

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

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 
+1

+1。あなたが私に最後の2つを忘れ去る方法を教えたら、もう1つ。 – DVK

+0

@DVK、 'chr'は非常に便利な関数です。しかし、これは明らかにそれを使う場所ではありません。 'v97'はバージョン文字列であり、バージョン文字列として使うのは特に良いことではありません。 – ikegami

関連する問題