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)