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


137

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

उदाहरण:

script.pl "string1" "string2"

3
ठीक है, पहले, आप इसे करने के लिए की जरूरत है ./script.plया एक पूरी तरह से कुछ नहीं हो रहा होगा 'रनटाइम आते हैं।
पार्थियन शॉट

जवाबों:


189

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

यदि उनके पास एक अलग अर्थ है, तो आप उपयोग कर सकते हैं 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


29
$ ARGV [0] पहला तर्क है; पर्ल 0 से गिना जाता है, और प्रोग्राम का नाम $ 0 में नहीं @ARGV है।
डेराबोट

4
$ ARGV [0] भ्रम के बावजूद .. इस तरह का उत्तर मुझे मिलने की उम्मीद है, जब मैं SO, धन्यवाद और +1 को मेरे साथ खोजता हूं।
lexu


60

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

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

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

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

}

से यहाँ


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

10
इसके बजाय $#ARGV + 1आप यह भी कह सकते थे@ARGV
लियोन टिम्मरमन्स

1
बस का उपयोग करें ARGV[0]या $argv[1]यदि आप विशेष तर्क के लिए देख रहे हैं।
मनोज

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

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


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

24

वैकल्पिक रूप से, एक कामुक रास्ता .....

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

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


6
निश्चित नहीं है कि यह नई जानकारी कैसे है, लेकिन मैंने एक नीचता के खिलाफ फैसला किया है, क्योंकि आप नए हैं।
जोएल बर्जर

यह कामुक नहीं है। सभी तर्क @ARGVबिना किसी कार्रवाई के आप के माध्यम से उपलब्ध हैं , जैसे C / C ++ उन्हें argv / argc के माध्यम से आपूर्ति करते हैं
Eugen Konkov

21

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

#!/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

या अधिक जानकारी के लिए मूल लेख देखें:


13

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

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

perl tmp.pl 1 2 3 4 5

यहां छवि विवरण दर्ज करें


7

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

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

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

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

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

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



2

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.