2009-08-08 8 views
6

मैं लंबे समय से लिनक्स उपयोगकर्ता हूं लेकिन विंडोज और पावरशेल में नया हूं। मैंने पहली बार विंडोज 7 और स्ट्रॉबेरी पर्ल 5 स्थापित किया था। अब मैं विंडोज पावरशेल के साथ एक सरल कमांड लाइन प्रिंट करना चाहता हूं।पावरशेल (पर्ल के साथ) एक साधारण प्रिंट स्टेटमेंट में डबल कोट्स को क्यों हटा रहा है?

ऐसा लगता है कि पर्ल की तरह सही ढंग से स्थापित:

 
PS C:\Users\Me> perl -v 
This is perl, v5.10.0 built for MSWin32-x86-multi-thread Copyright 
1987-2007, Larry Wall 
... 

और कमांड लाइन सामान काम करता है:

 
PS C:\Users\Me> perl -e 'die' 
Died at -e line 1. 

PS C:\Users\Me> echo 'print "Hello, World\n"' | perl 
Hello, World 

लेकिन जब मैं यह सब अपने आप में कोशिश यह एक filehandler चेतावनी प्रिंट:

 
PS C:\Users\Me> perl -e 'print "Hello, World\n"' 
No comma allowed after filehandle at -e line 1. 

तो ऐसा लगता है कि यह डबल कोट्स को हटा रहा है।

 
PS C:\Users\Me> perl -e 'print \"Hello, World\n\"' 
Hello, World 

यह काम करता है लेकिन इसके बदसूरत! आइए पुनः प्रयास करें:

 
PS C:\Users\Me> perl -e 'print qq{Hello, World\n}' 
Hello, World 

इस तरह की चीजें हैं, लेकिन मैं उलझन में हूं।

पावरशेल सिंगल कोट्स के भीतर डबल कोट्स से क्यों बच रहा है? कोई पावरशेल उपयोगकर्ता वहां से बाहर हैं?

+1

क्या आपने 'perl -e' प्रिंट 'हैलो, वर्ल्ड' 'की कोशिश की है? – Weegee

उत्तर

3

मुझे लगता है कि यहां कुछ समस्याएं हैं। एक यह है कि उद्धरणों में शक्तिशक्ति और पर्ल दोनों में प्रतीकात्मक अर्थ है। यूनिक्स शैल की तुलना में शक्तियों में उद्धरण और भागने से थोड़ा अलग काम होता है। पावरहेल में manquoting के बारे में आदमी को देखें।

दूसरा मुद्दा यह है कि perl कमांड लाइन विंडोज अवधि पर अलग-अलग व्यवहार करती है। कमांड लाइन के अंदर कोई भी डबल कोट जिसे आप पर्ल पर पास करना चाहते हैं उसे पर्ल शब्दों में से बचने की जरूरत है। "यह पावरहेल के लिए विशिष्ट नहीं है। विंडोज़ पर पर्ल काम करता है। आपको आम तौर पर इसी तरह की समस्याएं होती हैं । cmd.exe

इन संस्करणों काम करना चाहिए: कम एकल उद्धरण का उपयोग कर से बचने के साथ

PS> & perl -e "print \`"hello, world\n\`"" 
hello, world 
PS> $s = "print \`"hello, world\n\`"" 
PS> echo $s 
print \"hello, world\n\" 
PS> & perl -e $s 
hello, world 

आप एक ही बात कर सकते हैं।

PS> & perl -e 'print \"hello, world\n\"' 
hello, world 
PS> $s = 'print \"hello, world\n\"' 
PS> echo $s 
print \"hello, world\n\" 
PS> & perl -e $s 
hello, world 

आप पार्सिंग के लिए पर्ल पर एक न्यूलाइन एस्केप अनुक्रम पारित करने के बजाय पावरहेल में नई लाइन भी डाल सकते हैं।

PS> & perl -e "print \`"hello, world`n\`"" 
hello, world 
PS> $s = "print \`"hello, world`n\`"" 
PS> echo $s 
print \"hello, world 
\" 
PS> & perl -e $s 
hello, world 
0

क्या होता है यदि आप PowerShell के बजाय cmd.exe में "गलत" आदेश चलाते हैं तो क्या होता है? मैं पूछता हूं क्योंकि बचने वाला अनुक्रम अनुक्रम (\") पर्ल है; PowerShell में यह `` "`

1

दिलचस्प है। ऐसा लगता है कि जब आप पावरहेल दुनिया छोड़ते हैं, तो यह एकल कोट को दोहरा उद्धरण में परिवर्तित करता है ताकि विंडोज कमांड शैल द्वारा सही तरीके से व्याख्या की जा सके। (या कुछ ऐसा । कि) अजगर के साथ प्रदर्शित करने के लिए (जो एक ही समस्या) प्रदर्शन करने के लिए लगता है:

PS C:\> python -c 'print "Hi from python"' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'Hi' is not defined 

जो एक ही त्रुटि अगर मैं खिड़कियों कमांड शेल से कुछ इसी तरह करने की कोशिश की मैं मिलता है:

C:\>python -c "print "Hi from python"" 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'Hi' is not defined 

ऐसा लगता है कि सह निष्पादित करते समय पावरहेल ऐसा कर रहा है मिमी:

PS C:\> $s = 'python -c "print "Hi from python""' 
PS C:\> cmd /c $s 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'Hi' is not defined 
संबंधित मुद्दे