ฉันกำลังทำงานกับสคริปต์ Perl ฉันจะส่งพารามิเตอร์บรรทัดคำสั่งไปที่มันได้อย่างไร
ตัวอย่าง:
script.pl "string1" "string2"
ฉันกำลังทำงานกับสคริปต์ Perl ฉันจะส่งพารามิเตอร์บรรทัดคำสั่งไปที่มันได้อย่างไร
ตัวอย่าง:
script.pl "string1" "string2"
คำตอบ:
ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ หากคุณต้องการใช้สองอาร์กิวเมนต์เป็นไฟล์อินพุตคุณสามารถส่งผ่านอาร์กิวเมนต์เหล่านั้นจากนั้นใช้<>
เพื่ออ่านเนื้อหา
หากพวกเขามีความหมายที่แตกต่างกันคุณสามารถใช้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
คุณไม่จำเป็นต้องโมดูลพิเศษในการเข้าถึง
Contains the name of the current file when reading from <> .
@ARGV
คุณจะผ่านพวกเขาในเช่นเดียวกับคุณความคิดกำลังและในสคริปต์ของคุณคุณจะได้รับพวกเขาจากอาร์เรย์ ชอบมาก
my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";
foreach my $argnum (0 .. $#ARGV) {
print "$ARGV[$argnum]\n";
}
$#ARGV + 1
พูดอย่างนั้นก็ได้@ARGV
ARGV[0]
หรือ$argv[1]
หากคุณกำลังมองหาข้อโต้แย้งโดยเฉพาะ
foreach my $arg (@ARGV) {
print $arg, "\n";
}
จะพิมพ์แต่ละอาร์กิวเมนต์
อีกวิธีหนึ่งคือทางที่ผิดทางเพศ .....
my ($src, $dest) = @ARGV;
"ถือว่า" มีการส่งสองค่า รหัสพิเศษสามารถตรวจสอบสมมติฐานได้อย่างปลอดภัย
@ARGV
ทั้งหมดสามารถทำได้โดยไม่ต้องดำเนินการใด ๆ จากคุณเช่นเดียวกับ C / C ++ ให้พวกเขาผ่าน argv / argc
อีกตัวเลือกหนึ่งคือการใช้ Perl -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
หรือดูบทความต้นฉบับสำหรับรายละเอียดเพิ่มเติม:
คุณสามารถเข้าถึงได้โดยตรงโดยการกำหนดตัวแปรพิเศษ@ARGV
ให้กับรายการของตัวแปร ตัวอย่างเช่น:
( $st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV;
perl tmp.pl 1 2 3 4 5
หากอาร์กิวเมนต์เป็นชื่อไฟล์ที่ต้องอ่านให้ใช้ตัวดำเนินการ diamond (<>) เพื่อรับเนื้อหา:
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
จะใช้ได้เฉพาะเมื่อคุณอยู่นอกsub
s ทั้งหมดภายใน a sub
มันจะดึงรายการของอาร์กิวเมนต์ที่ส่งไปยังsub
มากกว่าที่ส่งผ่านไปยังโปรแกรม)
my $output_file;
if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))
{
$output_file= chomp($ARGV[1]) ;
}
หากคุณต้องการค่าบางอย่างคุณสามารถใช้อาร์เรย์ @ARGV ได้ แต่ถ้าคุณกำลังมองหาบางสิ่งบางอย่างมีประสิทธิภาพมากขึ้นเพื่อที่จะทำบางอย่างในการประมวลผลเลือกบรรทัดคำสั่งคุณควรใช้getopt :: ยาว
./script.pl
หรือจะไม่มีอะไรเกิดขึ้นทั้งหมด