2008-12-12 14 views
122

मैं एक पर्ल स्क्रिप्ट पर काम कर रहा हूं। मैं इसे कमांड लाइन पैरामीटर कैसे पास कर सकता हूं?मैं पर्ल प्रोग्राम में कमांड लाइन तर्क कैसे पास कर सकता हूं?

उदाहरण:

script.pl "string1" "string2" 
+0

कौन सा खोल उपयोग करते हैं? – reinierpost

+3

ठीक है, सबसे पहले, आपको इसकी आवश्यकता होगी।/Script.pl' या पूरी लोटा नहीं 'रनटाइम आ जाएगा। –

उत्तर

172

आप जो करना चाहते हैं उस पर निर्भर करता है। यदि आप इनपुट फ़ाइलों के रूप में दो तर्कों का उपयोग करना चाहते हैं, तो आप उन्हें केवल इन्हें पास कर सकते हैं और फिर <> का उपयोग अपनी सामग्री को पढ़ने के लिए कर सकते हैं।

यदि उनके पास एक अलग अर्थ है, तो आप उन्हें आसानी से संसाधित करने के लिए GetOpt::Std और GetOpt::Long का उपयोग कर सकते हैं। GetOpt::Std केवल एकल वर्ण स्विच का समर्थन करता है और GetOpt::Long अधिक लचीला है। GetOpt::Long से:

use Getopt::Long; 
my $data = "file.dat"; 
my $length = 24; 
my $verbose; 
$result = GetOptions ("length=i" => \$length, # numeric 
        "file=s" => \$data,  # string 
        "verbose" => \$verbose); # flag 

वैकल्पिक रूप से, @ARGV एक विशेष चर है कि सभी आदेश पंक्ति तर्क होता है। $ARGV[0] पहला है (यानी "string1" आपके मामले में) और $ARGV[1] दूसरा तर्क है। @ARGV तक पहुंचने के लिए आपको विशेष मॉड्यूल की आवश्यकता नहीं है।

+27

$ ARGV [0] पहला तर्क है; perl 0 से गिना जाता है, और प्रोग्राम का नाम $ 0 में @ARGV नहीं है। $ ARGV [0] भ्रम के बावजूद – derobert

+4

.. यह एक ऐसा उत्तर है जिसे मैं ढूंढने की उम्मीद करता हूं, जब मैं एसओ, धन्यवाद और +1 से खोजता हूं। – lexu

+0

$ एआरजीवी वेरिएबल है जो मैं तब उपयोग करूंगा। धन्यवाद। – lamcro

56

आप उन्हें में ठीक वैसे ही जैसा आप सोच रहे हैं गुजरती हैं, और अपनी स्क्रिप्ट में, आप उन्हें सरणी @ARGV से मिलता है। इस तरह:

my $numArgs = $#ARGV + 1; 
print "thanks, you gave me $numArgs command-line arguments.\n"; 

foreach my $argnum (0 .. $#ARGV) { 

    print "$ARGV[$argnum]\n"; 

} 

here से।

+7

यह भी ध्यान देने योग्य है कि कुछ प्रोग्रामिंग भाषाओं में पहला (0) तर्क कमांड या स्क्रिप्ट है ... हालांकि, बिलकुल भी नहीं। – danieltalsky

+9

'$ # एआरजीवी + 1' के बजाय आप यह भी कह सकते थे कि 'एआरजीवी' –

+0

केवल' एआरजीवी [0] 'या' $ argv [1] 'का उपयोग करें यदि आप विशेष तर्क की तलाश में हैं। – Manoj

27
foreach my $arg (@ARGV) { 
    print $arg, "\n"; 
} 

प्रत्येक तर्क मुद्रित करेगा।

+0

यदि गेटोपेट्स का उपयोग नहीं करते हैं, तो इस तरह मैं एक तर्क सूची को गैर विनाशकारी रूप से पार करने की अनुशंसा करता हूं। Http://www.perlmeme.org/howtos/syntax/foreach.html के आधार पर ऐसा लगता है कि वाक्यविन्यास सही है; एक चेतावनी के लिए, अनुभाग, _Side-Effects की जांच करें: नियंत्रण चर सूची तत्व के लिए उपनाम है – jaredor

7

तर्क फ़ाइल नाम से पढ़ा जा करने के लिए कर रहे हैं, उनकी सामग्री पर प्राप्त करने के लिए हीरा (<>) ऑपरेटर का उपयोग करें:

while (my $line = <>) { 
    process_line($line); 
} 

तर्क विकल्प/स्विच कर रहे हैं, getopt :: कक्षा या getopt का उपयोग :: लंबा, जैसा कि पहले से ही slavy13.myopenid.com द्वारा दिखाया गया है।

है कि वे कुछ और, आप उन्हें या तो स्पष्ट रूप @ARGV के माध्यम से चलने से या shift आदेश के साथ उपयोग कर सकते हैं कर रहे हैं बंद मौका पर:

while (my $arg = shift) { 
    print "Found argument $arg\n"; 
} 

(ध्यान दें कि shift के साथ ऐसा करने को केवल तभी काम करेंगे आप सभी sub रों के बाहर हैं। एक sub के भीतर, यह नहीं बल्कि कार्यक्रम के लिए पारित किया उन लोगों की तुलना sub के लिए पारित किया तर्कों की सूची प्राप्त हो सकें।)

2

तुम सिर्फ कुछ मान चाहते हैं, तो आप सिर्फ @ARGV उपयोग कर सकते हैं सरणी। लेकिन अगर आप कुछ कमांड लाइन विकल्प प्रोसेसिंग करने के लिए कुछ और अधिक शक्तिशाली खोज रहे हैं, तो आपको Getopt::Long का उपयोग करना चाहिए।

23

वैकल्पिक रूप से, एक sexier perlish तरह से .....

my ($src, $dest) = @ARGV;

"मानता" दो मानों पारित कर रहे हैं। अतिरिक्त कोड सत्यापित कर सकता है कि धारणा सुरक्षित है।

+6

यह सुनिश्चित नहीं है कि यह नई जानकारी कैसे है, लेकिन मैंने फैसला किया एक डाउनवोट के खिलाफ, क्योंकि आप नए हैं। –

+0

यह कामुक नहीं है। सभी ** तर्क आपके द्वारा किसी भी कार्रवाई के बिना '@ एआरजीवी' के माध्यम से उपलब्ध हैं ** जैसे सी/सी ++ उन्हें argv/argc –

19

फिर भी एक और विकल्प का उपयोग करने के लिए है पर्ल -s, जैसे:

#!/usr/bin/perl -s 

print "value of -x: $x\n"; 
print "value of -name: $name\n"; 

तो यह इस तरह कहते हैं:

% ./myprog -x -name=Jeff 
value of -x: 1 
value of -name: Jeff 

या अधिक जानकारी के लिए the original article देखें:

+0

के माध्यम से आपूर्ति करते हैं बहुत अच्छा और सरल! –

13

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

($st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV; 

पर्ल tmp.pl 1 2 3 4 5

enter image description here

+0

और इसका उपयोग कैसे किया जाता है? –

+0

अद्यतन टिप्पणी की जांच करें, आपको बस कमांडलाइन स्पेस से अलग होना होगा – pkm

5
my $output_file; 

if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i")) 

{ 

$output_file= chomp($ARGV[1]) ; 


} 
+2

अपने कोड पर अधिक जानकारी दें –

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

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