เราจะดูว่าเนื้อหาของอาเรย์นี้ถูกสร้างขึ้นและสามารถจัดการให้มีผลกระทบต่อที่ล่าม Perl จะหาไฟล์โมดูล
ค่าเริ่มต้น @INC
ล่าม Perl จะรวบรวมกับเฉพาะ@INC
ค่าเริ่มต้น เพื่อหาค่านี้เรียกใช้env -i perl -V
คำสั่ง ( env -i
ละเว้นPERL5LIB
ตัวแปรสภาพแวดล้อม - ดู # 2) และในผลลัพธ์คุณจะเห็นสิ่งนี้:
$ env -i perl -V
...
@INC:
/usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
/usr/lib/perl5/site_perl/5.18.0
/usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
/usr/lib/perl5/5.18.0
.
หมายเหตุ.
ในตอนท้าย; นี่คือไดเรกทอรีปัจจุบัน (ซึ่งไม่จำเป็นต้องเหมือนกับไดเรกทอรีของสคริปต์) มันจะหายไปใน Perl 5.26+ และเมื่อทำงานกับ Perl (ตรวจสอบมัวหมองเปิดใช้งาน)-T
หากต้องการเปลี่ยนเส้นทางเริ่มต้นเมื่อกำหนดค่าการรวบรวมไบนารี Perl ให้ตั้งค่าตัวเลือกการกำหนดค่าotherlibdirs
:
Configure -Dotherlibdirs=/usr/lib/perl5/site_perl/5.16.3
ตัวแปรสภาพแวดล้อมPERL5LIB
(หรือPERLLIB
)
Perl pre-pends @INC
พร้อมกับรายการไดเรกทอรี (คั่นด้วยโคลอน) ที่มีอยู่ในตัวแปรสภาพแวดล้อมPERL5LIB
(ถ้าไม่ได้กำหนด, PERLLIB
ใช้) ของเชลล์ของคุณ หากต้องการดูเนื้อหาของ@INC
หลังPERL5LIB
และตัวแปรสภาพแวดล้อมได้นำผลการทำงานPERLLIB
perl -V
$ perl -V
...
%ENV:
PERL5LIB="/home/myuser/test"
@INC:
/home/myuser/test
/usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
/usr/lib/perl5/site_perl/5.18.0
/usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
/usr/lib/perl5/5.18.0
.
-I
ตัวเลือกบรรทัดคำสั่ง
Perl ล่วงหน้าจะ@INC
มีรายการไดเรกทอรี (คั่นด้วยโคลอน) ที่ส่งผ่านเป็นค่าของ-I
ตัวเลือกบรรทัดคำสั่ง วิธีนี้สามารถทำได้สามวิธีเช่นเคยกับตัวเลือก Perl:
ส่งผ่านบรรทัดรับคำสั่ง:
perl -I /my/moduledir your_script.pl
ส่งผ่านบรรทัดแรก (shebang) ของสคริปต์ Perl ของคุณ:
#!/usr/local/bin/perl -w -I /my/moduledir
ผ่านมันเป็นส่วนหนึ่งของPERL5OPT
(หรือPERLOPT
) ตัวแปรสภาพแวดล้อม (ดูบทที่ 19.02 ในการเขียนโปรแกรม Perl )
ส่งผ่านทางlib
pragma
Perl pre-pends @INC
กับรายชื่อของไดเรกทอรีที่ส่งผ่านไปยังมันผ่านuse lib
ที่มีรายชื่อของไดเรกทอรีผ่านไปผ่าน
ในโปรแกรม:
use lib ("/dir1", "/dir2");
บนบรรทัดคำสั่ง:
perl -Mlib=/dir1,/dir2
นอกจากนี้คุณยังสามารถลบไดเรกทอรีจาก@INC
no lib
ผ่าน
คุณสามารถจัดการโดยตรง@INC
เป็นอาร์เรย์ Perl ปกติ
หมายเหตุ: เนื่องจาก@INC
ถูกใช้ในระหว่างขั้นตอนการรวบรวมสิ่งนี้จะต้องทำภายในBEGIN {}
บล็อกซึ่งนำหน้าuse MyModule
คำสั่ง
unshift @INC, $dir
เพิ่มไดเรกทอรีที่จุดเริ่มต้นผ่าน
push @INC, $dir
เพิ่มไดเรกทอรีไปยังจุดสิ้นสุดผ่าน
ทำอะไรก็ได้ที่คุณสามารถทำได้กับอาร์เรย์ Perl
หมายเหตุ: ไดเรกทอรีจะไม่ถูกเลื่อนลง@INC
ในลำดับที่ระบุไว้ในคำตอบนี้เช่นค่าเริ่มต้น@INC
จะอยู่ในรายการก่อนPERL5LIB
หน้าโดย-I
นำหน้านำหน้านำโดยuse lib
และโดยตรง@INC
การจัดการที่สองหลังผสมในแล้วแต่จำนวนใดจะสั่งพวกเขาอยู่ในรหัส Perl
อ้างอิง:
ดูเหมือนจะไม่มีการ@INC
โพสต์ประเภทคำถามที่พบบ่อยที่ครอบคลุมในกองล้นดังนั้นคำถามนี้มีวัตถุประสงค์เป็นหนึ่ง
ควรใช้แต่ละวิธีเมื่อใด
หากจำเป็นต้องใช้โมดูลในไดเรกทอรีโดยสคริปต์จำนวนมาก / ทั้งหมดบนเว็บไซต์ของคุณโดยเฉพาะผู้ใช้หลายรายที่เรียกใช้ไดเรกทอรีนั้นควรรวมอยู่ในค่าเริ่มต้นที่@INC
รวบรวมไว้ในไบนารี Perl
หากโมดูลในไดเรกทอรีจะถูกใช้โดยผู้ใช้เฉพาะสำหรับสคริปต์ทั้งหมดที่ผู้ใช้เรียกใช้ (หรือหากการคอมไพล์ซ้ำ Perl ไม่ใช่ตัวเลือกในการเปลี่ยนค่าเริ่มต้น@INC
ในกรณีการใช้งานก่อนหน้านี้) ให้ตั้งค่าของผู้PERL5LIB
ใช้
หมายเหตุ: โปรดระวังปกติ Unix ผิดพลาดตัวแปรสภาพแวดล้อม - su
เช่นในบางกรณีการทำงานสคริปต์ในฐานะผู้ใช้โดยเฉพาะอย่างยิ่งไม่ได้รับประกันการทำงานพวกเขากับสภาพแวดล้อมของผู้ใช้ตั้งค่าเช่นผ่านทาง
หากจำเป็นต้องใช้โมดูลในไดเรกทอรีเฉพาะในสถานการณ์ที่เฉพาะเจาะจง (เช่นเมื่อสคริปต์ถูกดำเนินการในโหมดการพัฒนา / การดีบักคุณสามารถตั้งค่าPERL5LIB
ด้วยตนเองหรือส่ง-I
ตัวเลือกไปยัง Perl
หากจำเป็นต้องใช้โมดูลสำหรับสคริปต์เฉพาะโดยผู้ใช้ทุกคนใช้ให้ใช้use lib
/ no lib
pragmas ในโปรแกรมเอง นอกจากนี้ควรใช้เมื่อไดเรกทอรีที่จะค้นหาต้องถูกกำหนดแบบไดนามิกระหว่างรันไทม์ - เช่นจากพารามิเตอร์บรรทัดคำสั่งของสคริปต์หรือเส้นทางของสคริปต์ (ดูโมดูลFindBinสำหรับกรณีการใช้งานที่ดีมาก)
หากไดเรกทอรีที่@INC
จำเป็นต้องจัดการตามตรรกะที่ซับซ้อนบางอย่างเป็นไปไม่ได้ที่จะใช้ความพยายามมากเกินไปโดยการรวมกันของuse lib
/ no lib
pragmas จากนั้นใช้การ@INC
จัดการโดยตรงในBEGIN {}
บล็อกหรือในห้องสมุดวัตถุประสงค์พิเศษที่กำหนดไว้สำหรับ@INC
จัดการ (s) ก่อนที่จะใช้โมดูลอื่น ๆ
ตัวอย่างของสิ่งนี้คือการสลับระหว่างไลบรารีในไดเร็กทอรี prod / uat / dev โดยอัตโนมัติด้วย Waterfall library pickup ใน prod หากมันหายไปจาก dev และ / หรือ UAT (เงื่อนไขสุดท้ายทำให้โซลูชัน "ใช้ lib + FindBin" มาตรฐานค่อนข้างซับซ้อน A ภาพประกอบรายละเอียดของสถานการณ์นี้อยู่ในฉันจะใช้โมดูล Perl เบต้าจากสคริปต์ Perl เบต้า?
กรณีการใช้งานเพิ่มเติมสำหรับการจัดการโดยตรง@INC
คือสามารถเพิ่มการอ้างอิงรูทีนย่อยหรือการอ้างอิงวัตถุ (ใช่เวอร์จิเนีย@INC
สามารถมีโค้ด Perl ที่กำหนดเองและไม่เพียงแค่ชื่อไดเรกทอรีตามที่อธิบายไว้ในเมื่อมีการอ้างอิงรูทีนย่อยใน @INC เรียกว่า? )