อะไรคือความแตกต่างระหว่าง.pm(Perl module) และ.pl(Perl script) ไฟล์?
กรุณาบอกเหตุผลที่เรากลับ1จากไฟล์ ถ้าส่งคืน 2 หรืออย่างอื่นมันไม่ได้สร้างข้อผิดพลาดใด ๆ แล้วทำไมเราถึงกลับ1จากโมดูล Perl?
อะไรคือความแตกต่างระหว่าง.pm(Perl module) และ.pl(Perl script) ไฟล์?
กรุณาบอกเหตุผลที่เรากลับ1จากไฟล์ ถ้าส่งคืน 2 หรืออย่างอื่นมันไม่ได้สร้างข้อผิดพลาดใด ๆ แล้วทำไมเราถึงกลับ1จากโมดูล Perl?
คำตอบ:
สิ่งสำคัญที่สุดคือนามสกุลไฟล์ที่คุณใช้ไม่มีความแตกต่างในการperlตีความไฟล์เหล่านั้น
อย่างไรก็ตามการใส่โมดูลลงใน.pmไฟล์ตามโครงสร้างไดเร็กทอรีบางอย่างที่ตามชื่อแพ็กเกจจะช่วยอำนวยความสะดวก ดังนั้นถ้าคุณมีโมดูลExample::Plot::FourDและคุณใส่ไว้ในไดเรกทอรีExample/Plot/FourD.pmในเส้นทางในของคุณ@INCแล้วuseและจะทำสิ่งที่ถูกต้องเมื่อได้รับชื่อแพคเกจในขณะที่requireuse Example::Plot::FourD
ไฟล์จะต้องคืนค่า true เป็นคำสั่งสุดท้ายเพื่อแสดงว่าการเรียกใช้รหัสเริ่มต้นใด ๆ ประสบความสำเร็จดังนั้นจึงเป็นเรื่องปกติที่จะต้องจบไฟล์ดังกล่าว
1;เว้นแต่คุณจะแน่ใจว่าจะส่งคืนจริงเป็นอย่างอื่น แต่จะดีกว่าแค่ใส่1;ในกรณีที่คุณเพิ่มงบมากขึ้นถ้า
EXPRเป็นคำเปล่าrequireจะถือว่านามสกุล ".pm" และแทนที่ "::" ด้วย "/" ในชื่อไฟล์ให้คุณเพื่อให้ง่ายต่อการโหลดโมดูลมาตรฐาน รูปแบบการโหลดโมดูลนี้ไม่เสี่ยงต่อการเปลี่ยนแปลงเนมสเปซของคุณ
สิ่งที่useต้องทำคือการหาชื่อไฟล์จากชื่อแพ็กเกจที่ระบุrequireไว้ในBEGINบล็อกและเรียกใช้importบนแพ็กเกจ ไม่มีสิ่งใดที่ป้องกันไม่ให้คุณไม่ใช้useแต่ทำตามขั้นตอนเหล่านั้นด้วยตนเอง
ยกตัวอย่างเช่นด้านล่างผมใส่Example::Plot::FourDแพคเกจในไฟล์ที่เรียกว่าโหลดไว้ในสคริปต์ในแฟ้มt.pls.pl
C:\Temp> cat t.pl
package Example::Plot::FourD;
use strict; use warnings;
sub new { bless {} => shift }
sub something { print "something\n" }
"Example::Plot::FourD"
C:\Temp> cat s.pl
#!/usr/bin/perl
use strict; use warnings;
BEGIN {
require 't.pl';
}
my $p = Example::Plot::FourD->new;
$p->something;
C:\Temp> s
something
ตัวอย่างนี้แสดงให้เห็นว่าไฟล์โมดูลไม่จำเป็นต้องลงท้าย1ด้วยค่าจริงใด ๆ จะทำ
A .pl เป็นสคริปต์เดียว
ใน. pm ( Perl Module ) คุณมีฟังก์ชันที่สามารถใช้จากสคริปต์ Perl อื่น ๆ :
โมดูล Perl เป็นส่วนหนึ่งของรหัส Perl ที่มีอยู่ในตัวซึ่งสามารถใช้โดยโปรแกรม Perl หรือโมดูล Perl อื่น ๆ มีแนวคิดคล้ายกับไลบรารีลิงก์ C หรือคลาส C ++
1ไม่เป็นไร. มันสามารถเป็น2ได้"foo"ก็เป็น["a", "list"]ได้ สิ่งที่สำคัญไม่ใช่0หรือสิ่งอื่นใดที่ประเมินว่าเป็นเท็จหรือuseล้มเหลว