2010-07-10 7 views
17

मैं ट्यूटोरियल के एक नंबर के माध्यम से देखा है, लेकिन मैं अभी भी समझ नहीं मैं गलत क्या कर रहा हूँ .. मैं नीचे दिए गए कोड कोशिश कर रहा हूँ (एक .pl पर्ल फ़ाइल में, एक निष्पादन योग्य के रूप में):पर्ल "एक लाइनर" कमांड लाइन स्क्रिप्ट को ठीक से कैसे चलाएं?

#!/usr/bin/perl 

perl -e 'print "Hello";' 

मैं इस स्क्रिप्ट को चलाने और मिलती है:

/home/user1/Desktop/file_backups.pl का निष्पादन संकलन त्रुटियों के कारण निरस्त किया गया।

(मैं पर्ल का उपयोग कर लिनक्स कमांड लाइन कॉल करने के लिए करने के लिए नए कर रहा हूँ।)

+1

क्या आपका मतलब है कि पर्ल लिनक्स (खोल) कमांड लाइन पर कॉल करें, या शेल कॉल पर्ल है? – Ether

उत्तर

12

perl एक पर्ल स्क्रिप्ट के अंदर एक वैध आदेश नहीं है। यदि आपने उस फ़ाइल को .sh स्क्रिप्ट के रूप में नामित किया था, और शेबैंग लाइन पर #!/bin/bash का उपयोग किया था, तो यह काम करता, लेकिन यह वास्तव में पर्ल को आमंत्रित करने के लिए बैश फ़ाइल लिखने के लिए बहुत अधिक समझ में नहीं आता है (क्यों पर्ल का आह्वान नहीं करते सीधे?)

चूंकि आपने बताया है कि आप कमांड लाइन से बातचीत करना चाहते हैं, तो मैं यहां उल्लेख करूंगा कि आप @ARGV सरणी के माध्यम से पर्ल के कमांड लाइन विकल्पों पर जा सकते हैं। (। perldoc perlvar देखें)

14

प्रयास करें:

#!/usr/bin/perl 
# This is a comment ~~~ 
# This script will be run as a Perl script 
# since 'perl' isn't a keyword or function in Perl 
# something like this must fail: 
# 
# perl -e 'print "Hello";' 
# 
# The following should work. 

print "Hello"; print " World\n"; 

या, यदि आप अपने खोल स्क्रिप्ट पर्ल कोड निष्पादित करने के लिए करना चाहते हैं:

#!/bin/sh 
# That's a Bash script ~~~ 
# It's just a command line in a file ...  

perl -e 'print "Hello World";' 

पृष्ठभूमि: #! एक interpreter directive है।

जब आदेश निष्पादित किया जाता है, तो इसे दुभाषिया के निष्पादन में परिवर्तित कर दिया जाता है।

0

ऐसा करने के लिए प्रयास कर रहे हों:

system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'"); 
+0

प्रतिक्रियाओं के लिए धन्यवाद .. अच्छी तरह से मैं जो करने की कोशिश कर रहा हूं वह है कि कमांड लाइन के साथ बातचीत करने वाली पर्ल स्क्रिप्ट्स लिखते हैं, मुझे लगता है कि मैं इसे पीछे की तरफ देख रहा था जैसा कि मैं देख रहा था बैल/खोल स्क्रिप्ट्स को perl – Rick

+3

पर कॉल करने के लिए है बुरी सलाह ओपी एक पर्ल स्क्रिप्ट के अंदर हैलो प्रिंट करना चाहता है। तो बस प्रिंट का उपयोग करें। – ghostdog74

+0

@ghostdog: मैं इसे सलाह देने की कोशिश नहीं कर रहा हूं, यह सिर्फ एक सीधा सवाल का जवाब है। मैं न्याय करने की कोशिश नहीं कर रहा हूँ। ऐसा लगता है कि वह विपरीत की तलाश में है, वैसे भी, इसलिए हम दोनों बंद हैं। :-) – eruciform

0

जब से तुम ने कहा कि आप विपरीत के लिए देख रहे हैं, यह हो सकता है तुम क्या मतलब है:

# vi stdin.pl 
# cat stdin.pl 
    #!/usr/bin/perl 
    while(<STDIN>) 
    { 
     if(/^hello/){ print "Hello back to ya!\n"; } 
    } 
# chmod 0777 stdin.pl 
# ./stdin.pl 
    foo 
    hello 
    Hello back to ya! 
# 
9
कमांड लाइन (एक फ़ाइल में नहीं) पर

बस प्रकार

perl -e 'print "Hello World\n";'

यह केवल ऑनलाइन लोगों के लिए अच्छा है।

$ for i in a b c ; do echo "$i is $i" > $i; done 

$ cat a b c 
a is a 
b is b 
c is c

हर कोई जानता है कि बड़े अक्षरों हैं ज्यादा बेहतर: लंबे समय तक स्क्रिप्ट अपने स्वयं के फ़ाइल की आवश्यकता है ...

0

आप निम्नलिखित आदानों है की शुभकामनाएं दें!

perl -i.bak -pe '$_ = uc' a b c

तो अब

$ cat a b c 
A IS A 
B IS B 
C IS C

लेकिन हम वास्तव में चाहते हैं कर सकते हैं एक आदेश में इस upcase कहा जाता है, और ऐसा करने के लिए आसान है!

#! /usr/bin/perl -pi.bak 
$_ = uc 

काम पर यह देखें:

$ for i in a b c ; do echo "$i is $i" > $i; done 

$ cat a b c 
a is a 
b is b 
c is c 

$ ./upcase a b c 

$ !cat 
cat a b c 
A IS A 
B IS B 
C IS C

एक answer to a similar question से और टिप्स:

-e विकल्प का परिचय पर्ल कोड निष्पादित-जो किया जाना है आप के रूप में एक स्क्रिप्ट के पर सोच सकते हैं कमांड लाइन-तो इसे छोड़ दें और शरीर में कोड चिपकाएं। Shebang (#!) लाइन में -p छोड़ें।

सामान्यतः, शेबांग लाइन में विकल्पों में से अधिकांश "क्लंप" पर चिपकना सुरक्षित है। यदि आपको और अधिक चाहिए, तो आप हमेशा अपने समकक्षों को BEGIN {} ब्लॉक के अंदर फेंक सकते हैं।

निष्पादन बिट चालू करने के लिए मत भूलना!

chmod +x script-name 

क्योंकि आप वास्तविक एक लाइनर आप परिवर्तित करना चाहते हैं नहीं दिया, मैं एक व्यापक, सामान्य जवाब देने के लिए किया था। यदि आप अपने प्रश्न को संपादित करने के लिए इसे संपादित करते हैं, तो आप इसे अधिक उपयोगी उत्तर दे सकते हैं।

3

यह काम करना चाहिए। सिंगल कोट्स के अंदर डबल कोट्स;)

perl -e "print 'Hello'" 
+0

मुझे इस पुरानी पोस्ट को पुनर्जीवित करने के लिए खेद है, लेकिन मैं विकल्पों के अर्थ को कहां देख सकता हूं? (यानी आपका "-e") धन्यवाद – Sosi

+1

@ सोसी "मैन पर्ल" –

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