আমি পার্ল প্রোগ্রামে কমান্ড-লাইন আর্গুমেন্ট কীভাবে পাস করতে পারি?


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
$ এআরজিভি [0] হ'ল প্রথম যুক্তি; পার্ল 0 থেকে গণনা করা হয়, এবং প্রোগ্রামটির নাম @ARGV নয় 0 ডলারে থাকে।
ডারোবার্ট

4
$ এআরজিভি [0] বিভ্রান্তি থাকা সত্ত্বেও .. এই ধরণের উত্তর আমি খুঁজে পেতে আশা করি, যখন আমি এসও অনুসন্ধান করি, তখন আমার কাছ থেকে ধন্যবাদ এবং +1 করুন।
লেেক্সু


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) টি আর্গুমেন্টটি হ'ল আদেশ বা স্ক্রিপ্ট নিজেই ... অবশ্য পার্লে অবশ্য তা নয় course
ড্যানিয়েলটালস্কি

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আপনার কাছ থেকে কোনো পদক্ষেপ ছাড়াই শুধু সি / সি মত ++ 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);
}

যদি আর্গুমেন্টগুলি বিকল্প / স্যুইচ হয় তবে স্লভী 13.myopenid.com দ্বারা ইতিমধ্যে প্রদর্শিত হিসাবে গেটআউট :: স্ট্যান্ড বা গেটঅপ :: লং ব্যবহার করুন।

তারা অন্য কিছু হওয়ার অফার সুযোগে আপনি স্পষ্টভাবে @ARGV এর মাধ্যমে বা shiftকমান্ডটি ব্যবহার করে সেগুলি অ্যাক্সেস করতে পারবেন :

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

(দ্রষ্টব্য যে এটির সাহায্যে shiftকাজ করা কেবল তখনই কাজ করবে যদি আপনি সকলের বাইরে থাকেন suba subএকের মধ্যে subএটি প্রোগ্রামে পাসের পরিবর্তে পাস হওয়া যুক্তিগুলির তালিকা পুনরুদ্ধার করবে ))



2

আপনি যদি কিছু মান চান তবে আপনি কেবল @ARGV অ্যারে ব্যবহার করতে পারেন। তবে আপনি যদি কিছু কমান্ড লাইন অপশন প্রক্রিয়াজাতকরণের জন্য আরও শক্তিশালী কিছু সন্ধান করেন তবে আপনার getopt :: Long ব্যবহার করা উচিত ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.