Các tập lệnh Perl thực sự không có phần mở rộng?


12

Tôi mới bắt đầu đọc Learning Perl, 4th Edition của O'Reilly và rất ngạc nhiên khi tôi xem qua đoạn trích này.

#!/usr/bin/perl
print "Hello, world!\n";

Hãy tưởng tượng rằng bạn đã nhập nó vào trình soạn thảo văn bản của bạn. (Đừng lo lắng về ý nghĩa của các bộ phận và cách chúng hoạt động. Bạn sẽ thấy về những phần đó ngay lập tức.) Bạn thường có thể lưu chương trình đó dưới bất kỳ tên nào bạn muốn. Perl không yêu cầu bất kỳ loại tên tệp hoặc phần mở rộng đặc biệt nào và tốt hơn hết là không nên sử dụng tiện ích mở rộng.

Tại sao tốt hơn là không có phần mở rộng? Hãy tưởng tượng rằng bạn đã viết một chương trình để tính điểm bowling và bạn đã nói với tất cả bạn bè của mình rằng nó được gọi là bowling.plx. Một ngày nọ bạn quyết định viết lại bằng C. Bạn vẫn gọi nó bằng cùng tên, ngụ ý rằng nó vẫn được viết bằng Perl? Hay bạn nói với mọi người rằng nó có một tên mới? (Và đừng gọi nó là bowling.c, làm ơn!) Câu trả lời là không phải việc họ viết bằng ngôn ngữ nào, nếu họ chỉ sử dụng ngôn ngữ đó. Vì vậy, nó nên được gọi đơn giản là bowling ở nơi đầu tiên.

Đây là nguồn duy nhất tôi thấy với chế độ xem này, mọi thứ khác tôi đã đọc đều hỗ trợ tiện ích mở rộng .pl. Tôi chưa phải là lập trình viên Perl và tôi muốn biết quan điểm của cộng đồng về điều này là gì trước khi tôi có thói quen.


Như các câu trả lời giải thích, phần mở rộng không quan trọng. Đối với các tập lệnh (bao gồm Perl), điều quan trọng là dòng shebang .

1
Không thưa ngài, đừng đồng ý. Không có phần mở rộng tập tin, làm thế nào các biên tập viên của IDE và lập trình viên quyết định làm nổi bật cú pháp?
GrandmasterB

3
@GrandmasterB bằng cách nhìn vào dòng shebang, hoặc bằng cách đọc mô hình. Tôi sẽ không bao giờ sử dụng .pltiện ích mở rộng cho các chương trình tôi muốn phân phối (thông tin đó là nhiễu, không phải tín hiệu), nhưng đó là một lời nhắc hữu ích cho các tập lệnh cục bộ. Dù sao, cuộc thảo luận này không liên quan đến> 90% mã Perl vì nó nằm trong một mô-đun ( .pmyêu cầu mở rộng) hoặc thử nghiệm ( .tthông lệ mở rộng).
amon

1
@GrandmasterB Tôi phát triển trên Linux và cả Vim và Kate đều xác định chính xác một tệp bắt đầu bằng dòng #!/usr/bin/env perldưới dạng tập lệnh Perl nếu tệp không có phần mở rộng xung đột (chẳng hạn như .cpp). Các filechương trình (được sử dụng để suy ra một kiểu MIME cho một đầu vào nhất định) deduces một cách chính xác text/x-perlbất kể phần mở rộng.
amon

3
Một nơi nào đó trong đó tôi nghĩ rằng chúng tôi lưu ý rằng .pl mở rộng đã cho p ERL l ibraries, và bằng cách nào đó biến thành những gì mọi người sử dụng cho các chương trình.
brian d foy

Câu trả lời:


14

Lời khuyên trong cuốn sách là hoàn toàn hợp lệ - ít nhất là đối với các hệ thống giống như UNIX. Việc thực thi tập lệnh được điều khiển bởi #!dòng, không phải bởi phần mở rộng của tên tệp. Sử dụng tiện ích mở rộng đặc biệt cho tập lệnh Perl sẽ hiển thị thông tin không quan trọng đối với bất kỳ ai đang chạy tập lệnh.

Windows là một vấn đề khác. Windows không hỗ trợ #!cơ chế; thay vào đó, phương thức được sử dụng để mở tệp phụ thuộc vào phần mở rộng. Ví dụ, trình bao Windows có thể được cấu hình để nhấp đúp vào .pltệp (hoặc thực thi tệp từ dấu nhắc) sẽ chuyển nó dưới dạng đối số cho trình thông dịch Perl. Cài đặt hệ thống Perl có thể sẽ tự động thiết lập cho bạn.

Đối với các tập lệnh Perl dự định là di động, .plhậu tố mà Windows yêu cầu có thể "rò rỉ" trên các hệ thống giống như UNIX. Có lẽ tốt nhất là có một phương pháp cài đặt dành riêng cho hệ thống, chọn một tên thích hợp cho tập lệnh khi nó được cài đặt.

Trên UNIX-like hệ thống, một .plphần mở rộng là chủ yếu là vô hại, và nếu bạn thấy nó hữu ích như một lời nhắc nhở về những gì ngôn ngữ được sử dụng bởi một kịch bản cụ thể (có lẽ bạn có một bộ sưu tập .pl, .py, .sh, và .rbkịch bản), sau đó bạn có thể làm điều đó. Nhưng có những nhược điểm đối với cách tiếp cận đó, như được mô tả trong cuốn sách: nếu bạn thực hiện lại một tập lệnh bằng một ngôn ngữ khác, bạn sẽ phải thay đổi tên và cập nhật bất cứ điều gì gọi nó.

(Các mô-đun Perl cần phải có .pmphần mở rộng để Perl có thể tìm thấy chúng. Ví dụ: cái này:

use Foo::Bar;

sẽ khiến trình thông dịch tìm kiếm một tệp có tên Bar.pmtrong thư mục aa có tên Foodưới một trong các thư mục được liệt kê trong @INCmảng. Nhưng .pmcác tệp không có nghĩa là được thực thi trực tiếp.)

Đây là nguồn duy nhất tôi thấy với chế độ xem này, mọi thứ khác tôi đã đọc đều hỗ trợ .pltiện ích mở rộng.

Tôi thấy điều đó đáng ngạc nhiên. Hầu hết các lời khuyên tôi đã thấy nói không nên sử dụng .pltiện ích mở rộng cho các tập lệnh thực thi.


1

Không quan trọng

#!/usr/bin/perl

cho hệ thống biết chương trình nào sẽ sử dụng để chạy mã.

nếu bạn đổi nó thành

#!/usr/bin/bash

hoặc là

#!/usr/bin/python

bạn sẽ sử dụng một trình thông dịch khác nhau.

Có tiện ích mở rộng là hoàn toàn tùy chọn và điểm mà người dùng không cần biết ngôn ngữ là chính xác 100% trong hầu hết các trường hợp.

chạy add 2 3và nhận lại 5 là tất cả những gì tôi quan tâm (với tư cách là người dùng).

Lần duy nhất tôi thêm tiện ích mở rộng vào tập lệnh là nếu tôi cần người dùng cuối (đôi khi là chính tôi) để biết ngôn ngữ vì một số lý do.

example.sh hoặc example.pl để hiển thị các cách khác nhau để hoàn thành cùng một nhiệm vụ.

Mặc dù vậy, tất cả những gì đã nói, phổ biến hơn là không có phần mở rộng, nhưng tất cả đều là hương vị.


1

Đoạn trích thực sự làm cho một lời khuyên hoàn toàn hợp lệ.

Tôi cũng sẽ nói thêm rằng, đối với một hệ thống nhỏ hơn, việc chuyển qua và đổi tên một vài tệp và / hoặc chuỗi ở đây và ở đó trong trường hợp thay đổi suy nghĩ của bạn về việc triển khai là khá đơn giản.

Mặt khác, một xu hướng hiện đại trong việc phát triển largish hệ thống ngụ ý có tập tin thực thi chính mà không cần bất kỳ phần mở rộng trong khi tất cả các module nó phụ thuộc vào để vẫn có phần mở rộng ngôn ngữ cụ thể.

Trong thực tế, Python yêu cầu điều này theo thiết kế và thông thường tập lệnh Python chính (tập lệnh không có phần mở rộng trong tên) chỉ là một vài dòng khởi động toàn bộ ứng dụng.


0

Tất cả những gì cuốn sách nói với bạn là trên Unix, phần mở rộng tập tin không có gì khác hơn là một quy ước. Trong thực tế, nhiều loại tập tin thuộc loại này. Các tệp Ruby sử dụng cùng một quy ước để chúng không cần phần mở rộng .rb. Trình biên dịch C chỉ cần mã C hợp lệ, vì vậy bạn có thể đặt tên cho chúng .watoozy nếu bạn muốn.

Trong khi không có hạn chế kỹ thuật, có những hạn chế thực tế của nguyên tắc ít gây bất ngờ nhất . Về cơ bản, sẽ rất ngạc nhiên khi thấy mã ruby ​​trong tệp .pl, vì vậy mọi người thường không làm điều đó.

Một ngoại lệ cho quy tắc

Trong một số ứng dụng máy chủ, tập lệnh khởi động nằm trong một tệp không có phần mở rộng để giúp khởi động ứng dụng như một dịch vụ dễ dàng hơn. Các tập tin trông giống như bất kỳ lệnh biên dịch khác trong trường hợp đó. Miễn là bạn đã cài đặt Perl, nó cũng sẽ hoạt động theo cách đó.


Trình biên dịch C thường xử lý các tệp đầu vào của chúng khác nhau tùy thuộc vào phần mở rộng. Ví dụ, đối xử với gcc .như mã nguồn C, .cpp, .cc, .Cnhư C ++ mã nguồn, .onhư một tập tin đối tượng được truyền lại cho các mối liên kết, và vân vân. Bạn có thể ghi đè lên điều đó bằng tùy chọn dòng lệnh, nhưng tôi đã sử dụng nó rất hiếm khi tôi không nhớ nó là gì. Phần .cmở rộng cho các tệp nguồn C rất quan trọng. Phần .plmở rộng cho các tập lệnh Perl thực thi không phải (ít nhất là trên các hệ thống giống như UNIX).
Keith Thompson

1
@KeithThndry: trên thực tế, trên hệ thống Unix tuân thủ SUS, các phần mở rộng tệp đó thậm chí là một phần của đặc tả cho c99lệnh: pubs.opengroup.org/onlinepub/9699919799/utilities/ trộm
Jörg W Mittag

-4

Đoạn trích, từ cuốn sách "O'Reilly's Learning Perl, 4th Edition" là rác rưởi. So sánh C với perl là không tương đương, đối với người mới bắt đầu C sẽ được biên dịch thành nhị phân, không có phần mở rộng.

Perl sẽ không được biên dịch nên một số trình soạn thảo văn bản sẽ cần phần mở rộng để xác định kiểu tệp.

Ngoài thực tiễn tốt nhất, bạn không nên mã hóa tên tệp kịch bản đầy đủ với phần mở rộng ở bất kỳ đâu trong hệ thống của mình, Bạn phải luôn sử dụng liên kết tượng trưng hoặc bí danh tùy thuộc vào hệ điều hành của bạn.

Trong tương lai nếu bạn cần thay đổi tệp gốc, bạn chỉ cần thay đổi liên kết tượng trưng để trỏ đến vị trí mới của bạn.


Tuyên bố về trình soạn thảo văn bản có thể hợp lệ - nhưng cả emacs và vim đều có thể phát hiện tập lệnh Perl mà không cần phần mở rộng đặc biệt. Yêu cầu của bạn về "thực hành tốt nhất" sẽ thuyết phục hơn với một số hỗ trợ. Tôi cài đặt các tập lệnh Perl trên các hệ thống (Linux) của mình mà không cần tiện ích mở rộng mọi lúc và điều đó không bao giờ gây ra sự cố.
Keith Thompson

Vâng, tất nhiên tập lệnh của bạn sẽ chạy nếu nó có dòng băm ( #!), bạn đề cập rằng bạn làm việc trên linux, điều này thật tuyệt .. lần sau khi bạn cài đặt một ứng dụng với trình quản lý gói hãy chú ý đến cách nó cũng tạo ra một symlink đến thư mục bin của bạn thay vì chỉ viết tệp trực tiếp vào binthư mục của bạn .. mọi thắc mắc tại sao.
Aaron Goshine

Có lẽ điều đó phụ thuộc vào người quản lý gói? Trên hệ thống Ubuntu 14.04 của tôi, tôi có 325 tập lệnh Perl được cài đặt trực tiếp bên dưới /usr/bin, không phải là liên kết tượng trưng; tất cả chúng đều được cài đặt bởi trình quản lý gói của hệ thống. Trình quản lý gói có cơ sở dữ liệu riêng theo dõi vị trí của tất cả các tệp cho mỗi gói. (Đối với phần mềm mà tôi xây dựng từ nguồn, tôi sử dụng symlink.) Nhưng tôi không chắc điều đó có liên quan đến việc liệu các tập lệnh Perl có nên có .plphần mở rộng hay không.
Keith Thompson

Tôi nghĩ rằng có thể đã đi đầu ở đây, điểm mà tôi đang cố gắng thực hiện là.
Aaron Goshine

1
Đã có nhiều ý kiến ​​để bình luận?
Keith Thompson
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.