2009-10-18 9 views
12

किसी को भी पता है क्या पार्स या पूर्वता निर्णय चेतावनी के परिणामस्वरूप 'कोष्ठकों "बदलाव" उपयोग की अस्पष्ट है' की तरह कोड के लिए जारी किया जा रहा:पर्ल द्वारा जारी किए गए चेतावनी के बिना "शिफ्ट का उपयोग" शिफ्ट क्यों अस्पष्ट है?

shift . 'some string'; 

# and not 

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

कुछ वाक्यात्मक निर्माणों आसान बनाने के लिए इस जानबूझकर है? या यह केवल पर्ल के पार्सर काम के तरीके का एक आर्टिफैक्ट है?

नोट: यह भाषा डिजाइन के बारे में चर्चा, नहीं

"@{[shift]}some string" 

उत्तर

25

use diagnostics के साथ, आप उपयोगी संदेश मिलता है:

 
    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. 

डर आप shift .5 की तरह कुछ लिख सकता है और यह shift(0.5) तरह पार्स किया जाएगा।

+0

मैं ऊपर उठूंगा, लेकिन "मेरी दैनिक वोट सीमा तक पहुंच गई है।" मुझे लगता है कि यह एक बग है, क्योंकि मुझे लगता है कि कुछ समय के लिए कुछ समय के लिए नीचे चला गया था जब इसे रीसेट करना था, इसलिए मुझे कल मतदान करने के लिए दंडित किया जा रहा है। रैंड (; $) के मामले में –

+0

मैं चेतावनी के लिए एक मामला देख सकता हूं, हालांकि, शिफ्ट के साथ ऐसा प्रतीत नहीं होता है, क्योंकि शिफ्ट के प्रोटोटाइप (; \ @) एक स्ट्रिंग या संख्या को वैध तर्क होने से रोक देगा –

+1

@Eric Strom: यह त्रुटि टोकनज़र से आता है, जो कि स्मार्ट नहीं है। असंबद्ध रूप से, शिफ्ट का प्रोटोटाइप वास्तव में नहीं है (; \ @), क्योंकि इससे इसे एक सूची ऑपरेटर बना दिया जाएगा और यह वास्तव में एक यूनरी ऑपरेटर है। – ysth

8

अस्पष्ट सुझाव देने के लिए इसका मतलब यह नहीं वास्तव में, अस्पष्ट बस के रूप में अब तक अस्पष्ट रूप पार्सर निर्धारित था एक जगह है। shift . विशेष रूप से "संदिग्ध" है क्योंकि . एक शब्द (उदाहरण के लिए .123) या एक ऑपरेटर, शुरू कर सकता है, इसलिए यह तय करने के लिए पर्याप्त नहीं है कि शिफ्ट के ऑपरेंड या ऑपरेटर के लिए कौन सा शिफ्ट() ऑपरेंड है (और पार्सर यह जानने के लिए पर्याप्त स्मार्ट नहीं है कि: ए) . ऐसी अवधि की शुरुआत नहीं है या बी) .123 शिफ्ट के लिए मान्य ऑपरेंड नहीं है)।

संबंधित मुद्दे