2009-10-18 9 views
12

kimse ayrıştırma veya öncelik kararları uyarı ile sonuçlanan biliyor mu 'parantez olmadan 'shift' Kullanımı belirsiz olduğu' gibi kod için çıkarılmış olan: Belirli sözdizimsel yapıları kolaylaştırmak için bu kasıtlıPerl tarafından yayınlanan 'parantez kullanılmadan' geçiş 'neden belirsizdir' uyarısıdır?

shift . 'some string'; 

# and not 

(shift) . 'some string'; # or 
shift() . 'some string'; 

mi? Ya da perl'in ayrıştırıcılarının işleyişinin bir eseri mi?

Not: Bu dil tasarımı hakkında bir tartışma değil, gerçekten belirsiz sadece belirsiz kadarıyla ayrıştırıcı belirlendi ettiği gibi anlamına gelmez Muğlak

"@{[shift]}some string" 

cevap

25

use diagnostics ile, yararlı mesajı alır:

 
    Warning: Use of "shift" without parentheses is ambiguous at (eval 
     9)[/usr/lib/perl5/5.8/perl5db.pl:628] line 2 (#1) 
    (S ambiguous) You wrote a unary operator followed by something that 
    looks like a binary operator that could also have been interpreted as a 
    term or unary operator. For instance, if you know that the rand 
    function has a default argument of 1.0, and you write 

     rand + 5; 

    you may THINK you wrote the same thing as 

     rand() + 5; 

    but in actual fact, you got 

     rand(+5); 

    So put in parentheses to say what you really mean. 

korku Eğer shift .5 gibi bir şey yazabilirsiniz olduğunu ve shift(0.5) gibi ayrıştırılır.

+0

Yararlı olurum, ancak "günlük oy limitine ulaşıldı." Bence bu bir hatadır, çünkü sanırım SO, sıfırlanması gereken zamanın birkaç dakikasına düştü, bu yüzden dün oy verdiğim için cezalandırıldım. –

+0

rand (; $) durumunda uyarı için bir durum görebiliyorum, ancak vardiya ile vardiya yoktur, çünkü vardiyadaki prototip (; \ @) bir dizgenin veya sayının geçerli bir argüman olmasını engelleyecektir. –

+1

@Eric Strom: Bu hata, o kadar akıllı olmayan tokenizatörden geliyor. Buna bağlı olarak, vardiya prototipi gerçekten (; \ @) değildir, çünkü bu bir liste operatörü olur ve aslında tek bir operatördür. – ysth

8

önermek bir yerdir. shift . özellikle "belirsiz" dir, çünkü . bir terimi (örn. .123) veya bir operatör, başlatabilir; bu nedenle, vardiya işleneni veya vardiyada() işlenen olan işleç olup olmadığını belirlemeye yetecek kadar bilgi sahibi değildir (ve ayrıştırıcı bunu bilecek kadar akıllı değildir: a) . , böyle bir terimin başlangıcı değildir veya b) .123, vardiya için geçerli bir işlenendir değildir).

İlgili konular