Trong Perl, sự khác biệt giữa tệp .pm (Perl module) và .pl (Perl script) là gì?


88

Sự khác biệt giữa tệp .pm(mô-đun Perl) và .pl(tập lệnh Perl) là gì?

Cũng xin vui lòng cho tôi biết lý do tại sao chúng tôi trở lại 1từ hồ sơ. Nếu trả về 2 hoặc bất kỳ điều gì khác, nó không tạo ra bất kỳ lỗi nào, vậy tại sao chúng tôi trả về 1từ mô-đun Perl?


11
1không quan trọng. Nó có thể được 2, nó có thể được "foo", nó có thể được ["a", "list"]. Điều quan trọng là nó không 0, hoặc bất kỳ thứ gì khác được đánh giá là sai, hoặc usesẽ thất bại.
Amadan

.pl thực sự là một thư viện perl - các tập lệnh perl, giống như chương trình C hoặc các chương trình được viết bằng các ngôn ngữ khác, không có phần cuối, ngoại trừ trên các hệ điều hành cần một phần cuối để hoạt động, chẳng hạn như cửa sổ.
Hãy nhớ Monica

Câu trả lời:


78

Về cốt lõi, phần mở rộng tệp bạn sử dụng không có gì khác biệt về cách perldiễn giải các tệp đó.

Tuy nhiên, việc đặt các mô-đun trong .pmcác tệp theo một cấu trúc thư mục nhất định theo sau tên gói cung cấp một sự tiện lợi. Vì vậy, nếu bạn có một mô-đun Example::Plot::FourDvà bạn đặt nó trong một thư mục Example/Plot/FourD.pmtrong một đường dẫn trong của bạn @INC, thì userequiresẽ thực hiện đúng khi được cung cấp tên gói như trong use Example::Plot::FourD.

Tệp phải trả về true như câu lệnh cuối cùng để chỉ ra việc thực thi thành công bất kỳ mã khởi tạo nào, vì vậy, thông thường sẽ kết thúc tệp như vậy 1; trừ khi bạn chắc chắn rằng nó sẽ trả về true. Nhưng tốt hơn là chỉ đặt 1;, trong trường hợp bạn thêm nhiều câu lệnh.

Nếu EXPRlà từ trần, requiregiả sử có phần mở rộng ".pm" và thay thế "::" bằng "/" trong tên tệp cho bạn, để giúp bạn dễ dàng tải các mô-đun chuẩn. Hình thức tải mô-đun này không có nguy cơ làm thay đổi không gian tên của bạn.

Tất cả những gì uselàm là tìm ra tên tệp từ tên gói được cung cấp, requirenó trong một BEGINkhối và gọi importtrên gói. Không có gì ngăn cản bạn không sử dụng usenhưng thực hiện các bước đó theo cách thủ công.

Ví dụ, bên dưới tôi đặt Example::Plot::FourDgói trong một tệp có tên t.pl, tải nó trong một tập lệnh trong tệp s.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

Ví dụ này cho thấy rằng các tệp mô-đun không phải kết thúc bằng 1, bất kỳ giá trị thực nào cũng sẽ làm được.


-2

.Pl là một tập lệnh duy nhất.

Trong .pm ( Perl Module ), bạn có các chức năng mà bạn có thể sử dụng từ các tập lệnh Perl khác:

Mô-đun Perl là một đoạn mã Perl độc lập có thể được sử dụng bởi chương trình Perl hoặc các mô-đun Perl khác. Về mặt khái niệm, nó tương tự như một thư viện liên kết C hoặc một lớp C ++.


5
"A .pl là một tập lệnh đơn." Không đúng. Chỉ trên các hệ điều hành bị hỏng, bạn mới cần xác định các chương trình Perl bằng phần mở rộng .pl. Và ban đầu .pl chỉ ra một "thư viện Perl" - các chương trình con bên ngoài mà bạn đã tải bằng lệnh "request" hoặc "do".
Dave Cross
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.