Perl - แพ็คเกจและโมดูล
แพ็คเกจคืออะไร?
packageคำสั่งสลับบริบทการตั้งชื่อปัจจุบันเป็นเนมสเปซที่ระบุ (ตารางสัญลักษณ์) ดังนั้น -
แพ็กเกจคือชุดของรหัสที่อยู่ในเนมสเปซของตัวเอง
เนมสเปซคือชุดชื่อตัวแปรเฉพาะ (เรียกอีกอย่างว่าตารางสัญลักษณ์)
Namespaces ป้องกันการชนชื่อตัวแปรระหว่างแพ็กเกจ
แพ็กเกจเปิดใช้งานการสร้างโมดูลซึ่งเมื่อใช้แล้วจะไม่ทำให้ตัวแปร clobber และฟังก์ชันนอกเนมสเปซของโมดูล
แพ็กเกจจะมีผลจนกว่าจะมีการเรียกใช้คำสั่งแพ็กเกจอื่นหรือจนกว่าจะสิ้นสุดบล็อกหรือไฟล์ปัจจุบัน
คุณสามารถอ้างถึงตัวแปรภายในแพ็คเกจได้อย่างชัดเจนโดยใช้ไฟล์ :: คุณสมบัติแพ็คเกจ
ต่อไปนี้เป็นตัวอย่างที่มีแพ็กเกจหลักและ Foo ในไฟล์ ที่นี่มีการใช้ตัวแปรพิเศษ __PACKAGE__ เพื่อพิมพ์ชื่อแพ็กเกจ
#!/usr/bin/perl
# This is main package
$i = 1;
print "Package name : " , __PACKAGE__ , " $i\n";
package Foo;
# This is Foo package
$i = 10;
print "Package name : " , __PACKAGE__ , " $i\n";
package main;
# This is again main package
$i = 100;
print "Package name : " , __PACKAGE__ , " $i\n";
print "Package name : " , __PACKAGE__ , " $Foo::i\n";
1;
เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10
BEGIN และ END Blocks
คุณสามารถกำหนดบล็อกโค้ดจำนวนเท่าใดก็ได้ที่ชื่อ BEGIN และ END ซึ่งทำหน้าที่เป็นตัวสร้างและตัวทำลายตามลำดับ
BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
ทุก BEGIN บล็อกจะถูกดำเนินการหลังจากโหลดและคอมไพล์สคริปต์ perl แต่ก่อนที่จะดำเนินการคำสั่งอื่น
ทุกบล็อก END จะถูกดำเนินการก่อนที่ตัวแปล perl จะออก
บล็อก BEGIN และ END มีประโยชน์อย่างยิ่งเมื่อสร้างโมดูล Perl
ตัวอย่างต่อไปนี้แสดงการใช้งาน -
#!/usr/bin/perl
package Foo;
print "Begin and Block Demo\n";
BEGIN {
print "This is BEGIN Block\n"
}
END {
print "This is END Block\n"
}
1;
เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
This is BEGIN Block
Begin and Block Demo
This is END Block
Perl Modules คืออะไร?
โมดูล Perl เป็นแพ็กเกจที่ใช้ซ้ำได้ซึ่งกำหนดไว้ในไฟล์ไลบรารีที่มีชื่อเหมือนกับชื่อของแพ็กเกจที่มี. pm เป็นนามสกุล
เรียกไฟล์โมดูล Perl Foo.pm อาจมีข้อความเช่นนี้
#!/usr/bin/perl
package Foo;
sub bar {
print "Hello $_[0]\n"
}
sub blat {
print "World $_[0]\n"
}
1;
ประเด็นสำคัญเล็กน้อยเกี่ยวกับโมดูล Perl
ฟังก์ชั่น require และ use จะโหลดโมดูล
ทั้งสองใช้รายการเส้นทางการค้นหาใน @INC เพื่อค้นหาโมดูล
ทั้งสองฟังก์ชั่น require และ use โทร eval ฟังก์ชันประมวลผลโค้ด
1; ที่ด้านล่างทำให้ eval ประเมินเป็น TRUE (ดังนั้นจึงไม่ล้มเหลว)
ต้องการฟังก์ชัน
สามารถโหลดโมดูลได้โดยเรียกไฟล์ require ฟังก์ชันดังต่อไปนี้ -
#!/usr/bin/perl
require Foo;
Foo::bar( "a" );
Foo::blat( "b" );
คุณต้องสังเกตว่าชื่อรูทีนย่อยต้องมีคุณสมบัติครบถ้วนเพื่อเรียกใช้ จะเป็นการดีที่จะเปิดใช้งานรูทีนย่อยbar และ blat เพื่อนำเข้าสู่เนมสเปซของเราเองดังนั้นเราจึงไม่ต้องใช้ Foo :: qualifier
ฟังก์ชันการใช้งาน
สามารถโหลดโมดูลได้โดยเรียกไฟล์ use ฟังก์ชัน
#!/usr/bin/perl
use Foo;
bar( "a" );
blat( "b" );
สังเกตว่าเราไม่จำเป็นต้องกำหนดชื่อฟังก์ชันของแพ็กเกจให้ครบถ้วน use ฟังก์ชันจะส่งออกรายการสัญลักษณ์จากโมดูลที่ได้รับข้อความเพิ่มเติมบางส่วนภายในโมดูล
require Exporter;
@ISA = qw(Exporter);
จากนั้นให้รายการสัญลักษณ์ (สเกลาร์ลิสต์แฮชรูทีนย่อย ฯลฯ ) โดยกรอกตัวแปรรายการชื่อ @EXPORT: ตัวอย่างเช่น -
package Module;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);
sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" }
sub splat { print "Not $_[0]\n" } # Not exported!
1;
สร้างแผนผังโมดูล Perl
เมื่อคุณพร้อมที่จะจัดส่งโมดูล Perl ของคุณแล้วมีวิธีมาตรฐานในการสร้างโครงสร้างโมดูล Perl ทำได้โดยใช้ไฟล์h2xsยูทิลิตี้ ยูทิลิตี้นี้มาพร้อมกับ Perl นี่คือไวยากรณ์ที่จะใช้ h2xs -
$h2xs -AX -n ModuleName
ตัวอย่างเช่นหากโมดูลของคุณพร้อมใช้งานใน Person.pm จากนั้นออกคำสั่งต่อไปนี้ -
$h2xs -AX -n Person
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST
นี่คือคำอธิบายของตัวเลือกเหล่านี้ -
-A ละเว้นรหัส Autoloader (ใช้ดีที่สุดโดยโมดูลที่กำหนดรูทีนย่อยจำนวนมากที่ใช้ไม่บ่อย)
-X ละเว้นองค์ประกอบ XS (eXternal Subroutine โดยที่ eXternal หมายถึงภายนอกของ Perl เช่น C)
-n ระบุชื่อของโมดูล
ดังนั้นคำสั่งดังกล่าวจึงสร้างโครงสร้างต่อไปนี้ภายในไดเรกทอรีบุคคล ผลลัพธ์จริงแสดงไว้ด้านบน
- Changes
- Makefile.PL
- MANIFEST (มีรายการไฟล์ทั้งหมดในแพ็คเกจ)
- README
- t / (ไฟล์ทดสอบ)
- lib / (ซอร์สโค้ดจริงอยู่ที่นี่
ในที่สุดคุณ tarโครงสร้างไดเร็กทอรีนี้ลงในไฟล์ Person.tar.gz และคุณสามารถจัดส่งได้ คุณจะต้องอัปเดตไฟล์ README ด้วยคำแนะนำที่เหมาะสม คุณยังสามารถจัดเตรียมไฟล์ตัวอย่างการทดสอบในไดเร็กทอรี t
การติดตั้งโมดูล Perl
ดาวน์โหลดโมดูล Perl ในรูปแบบไฟล์ tar.gz ใช้ลำดับต่อไปนี้เพื่อติดตั้งโมดูล PerlPerson.pm ซึ่งได้รับการดาวน์โหลดในรูปแบบ Person.tar.gz ไฟล์.
tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install
ตัวแปลภาษา Perl มีรายการไดเร็กทอรีที่ใช้ค้นหาโมดูล (global array @INC)