สคริปต์ Perl ควรมีส่วนขยายหรือไม่


12

ฉันเพิ่งเริ่มอ่านLearning Perl รุ่นที่ 6ของ O'Reilly และรู้สึกประหลาดใจเมื่อฉันเจอข้อความที่ตัดตอนมานี้

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

ลองจินตนาการว่าคุณได้พิมพ์ข้อความนั้นลงในโปรแกรมแก้ไขข้อความ (ไม่ต้องกังวลเกี่ยวกับความหมายของชิ้นส่วนและวิธีการทำงานคุณจะเห็นเกี่ยวกับชิ้นส่วนในเวลาสั้น ๆ ) โดยทั่วไปคุณสามารถบันทึกโปรแกรมนั้นภายใต้ชื่อที่คุณต้องการ Perl ไม่ต้องการชื่อไฟล์หรือส่วนขยายพิเศษใด ๆ และเป็นการดีกว่าที่จะไม่ใช้ส่วนขยายเลย

ทำไมมันถึงดีกว่าถ้าไม่มีนามสกุล ลองนึกภาพว่าคุณเขียนโปรแกรมเพื่อคำนวณคะแนนโบว์ลิ่งและคุณได้บอกเพื่อน ๆ ทุกคนของคุณว่ามันเรียกว่า bowling.plx วันหนึ่งคุณตัดสินใจที่จะเขียนมันใหม่ในซีคุณยังเรียกมันด้วยชื่อเดียวกันนั่นก็หมายความว่ามันยังเขียนด้วยภาษา Perl อยู่หรือเปล่า? หรือคุณบอกทุกคนว่ามีชื่อใหม่ (และอย่าเรียกมันว่า bowling.c โปรด!) คำตอบก็คือมันไม่มีธุรกิจใดที่พวกเขาจะเขียนภาษาถ้าพวกเขาใช้มัน ดังนั้นควรเรียกง่ายๆว่าโบว์ลิ่งในตอนแรก

นี่เป็นแหล่งข้อมูลเดียวที่ฉันเห็นด้วยมุมมองนี้ทุกอย่างที่ฉันอ่านได้รองรับส่วนขยาย. pl ฉันยังไม่มีโปรแกรมเมอร์ Perl และฉันต้องการทราบว่ามุมมองของชุมชนเกี่ยวกับเรื่องนี้คืออะไรก่อนที่ฉันจะติดเป็นนิสัย


ดังที่คำอธิบายอธิบายส่วนขยายนั้นไม่สำคัญ สำหรับสคริปต์ (รวมทั้ง Perl), สิ่งที่สำคัญคือสาย shebang

1
ไม่ครับไม่เห็นด้วย หากไม่มีนามสกุลไฟล์บรรณาธิการของ IDE และโปรแกรมเมอร์จะตัดสินใจเกี่ยวกับการเน้นไวยากรณ์อย่างไร
GrandmasterB

3
@GrandmasterB โดยดูที่บรรทัด shebang หรืออ่าน modelines ฉันจะไม่ใช้.plส่วนขยายสำหรับโปรแกรมที่ฉันต้องการแจกจ่าย (ข้อมูลนั้นเป็นสัญญาณรบกวนไม่ใช่สัญญาณ) แต่เป็นเครื่องมือเตือนความจำที่มีประโยชน์สำหรับสคริปต์ในเครื่อง อย่างไรก็ตามการสนทนานี้ไม่เกี่ยวข้องกับ> 90% ของรหัส Perl เนื่องจากอาจอยู่ในโมดูล ( .pmจำเป็นต้องใช้ส่วนขยาย) หรือแบบทดสอบ ( .tส่วนขยายตามธรรมเนียม)
amon

1
@GrandmasterB ฉันพัฒนาบน Linux และทั้ง Vim และ Kate ระบุไฟล์ที่ขึ้นต้นด้วยบรรทัด#!/usr/bin/env perlเป็นสคริปต์ Perl อย่างถูกต้องหากไฟล์ไม่มีส่วนขยายที่ขัดแย้งกัน (เช่น.cpp) fileโปรแกรม (ใช้ในการอนุมานชนิดไมม์สำหรับการป้อนข้อมูลที่กำหนด) อย่างถูกต้องฉงนฉงายtext/x-perlโดยไม่คำนึงถึงการขยาย
amon

3
ที่ไหนสักแห่งในนั้นฉันคิดว่าเราสังเกตว่าส่วนขยาย. pl ใช้สำหรับห้องสมุดp erl lและอย่างใดปรับเปลี่ยนในสิ่งที่ผู้คนใช้สำหรับโปรแกรม
brian d foy

คำตอบ:


14

คำแนะนำในหนังสือเล่มนี้ใช้ได้อย่างสมบูรณ์แบบ - อย่างน้อยสำหรับระบบที่เหมือนยูนิกซ์ การดำเนินการของสคริปต์จะถูกควบคุมโดย#!บรรทัดไม่ใช่ส่วนขยายของชื่อไฟล์ การใช้ส่วนขยายพิเศษสำหรับสคริปต์ Perl จะเปิดเผยข้อมูลที่ไม่ควรสำคัญสำหรับทุกคนที่เรียกใช้สคริปต์

Windows เป็นเรื่องที่แตกต่าง Windows ไม่รองรับ#!กลไกนี้ แต่วิธีที่ใช้ในการเปิดไฟล์นั้นขึ้นอยู่กับนามสกุล ตัวอย่างเช่นเชลล์ Windows อาจได้รับการกำหนดค่าเพื่อให้ดับเบิลคลิกที่.plไฟล์ (หรือเรียกใช้งานจากพรอมต์) จะผ่านมันเป็นอาร์กิวเมนต์ไปยังล่าม Perl การติดตั้งระบบ Perl อาจตั้งค่าให้คุณโดยอัตโนมัติ

สำหรับสคริปต์ Perl ที่ต้องการให้พกพาได้.plส่วนต่อท้ายที่ Windows ต้องการอาจ "รั่วไหล" ไปยังระบบที่คล้ายกับ UNIX อาจเป็นการดีที่สุดที่จะมีวิธีการติดตั้งเฉพาะระบบที่เลือกชื่อที่เหมาะสมสำหรับสคริปต์เมื่อทำการติดตั้ง

บน UNIX เหมือนระบบเป็น.plส่วนขยายส่วนใหญ่จะเป็นอันตรายและถ้าคุณพบว่ามีประโยชน์เป็นตัวเตือนของภาษาที่ใช้โดยสคริปต์เฉพาะ (บางทีคุณอาจมีคอลเลกชันของ.pl, .py, .shและ.rbสคริปต์) แล้วคุณสามารถทำเช่นนั้น แต่มีข้อเสียคือวิธีการดังกล่าวตามที่อธิบายไว้ในหนังสือ: หากคุณใช้สคริปต์ในภาษาอื่นคุณจะต้องเปลี่ยนชื่อและอัปเดตสิ่งที่เรียกว่า

( โมดูล Perl ต้องมี.pmส่วนขยายเพื่อให้ Perl สามารถค้นหาได้ตัวอย่างเช่น:

use Foo::Bar;

จะทำให้ล่ามเพื่อค้นหาไฟล์ที่มีชื่อBar.pmในไดเรกทอรี aa ชื่อFooภายใต้หนึ่งในไดเรกทอรีที่ระบุไว้ใน@INCอาร์เรย์ แต่.pmไฟล์ไม่ได้ถูกเรียกใช้โดยตรง)

นี่เป็นแหล่งข้อมูลเดียวที่ฉันเห็นด้วยมุมมองนี้ทุกอย่างที่ฉันอ่านได้รองรับ.plส่วนขยาย

ฉันพบว่าน่าแปลกใจ คำแนะนำส่วนใหญ่ที่ฉันเคยเห็นบอกว่าจะไม่ใช้.plส่วนขยายสำหรับสคริปต์ที่ปฏิบัติการได้


1

ไม่เป็นไร

#!/usr/bin/perl

บอกให้ระบบทราบว่าโปรแกรมใดที่จะใช้เพื่อเรียกใช้รหัส

หากคุณเปลี่ยนเป็น

#!/usr/bin/bash

หรือ

#!/usr/bin/python

คุณจะใช้ล่ามคนอื่น

การมีส่วนขยายนั้นเป็นตัวเลือกทั้งหมดและจุดที่ผู้ใช้ไม่จำเป็นต้องรู้ว่าภาษานั้นถูกต้อง 100% ในกรณีส่วนใหญ่

เรียกใช้add 2 3และรับกลับ 5 เป็นสิ่งที่ฉันสนใจ (ในฐานะผู้ใช้)

ครั้งเดียวที่ฉันเพิ่มส่วนขยายในสคริปต์คือถ้าฉันต้องการให้ผู้ใช้ (บางครั้งตัวเอง) รู้ภาษาด้วยเหตุผลบางอย่าง

example.sh หรือ example.pl เพื่อแสดงวิธีต่างๆในการทำงานเดียวกันให้สำเร็จ

ทุกอย่างที่กล่าวมามันเป็นเรื่องธรรมดามากกว่าที่จะไม่มีส่วนขยาย แต่มันก็มีรสชาติ


1

ตัดตอนมาแน่นอนทำให้คำแนะนำที่ถูกต้องสมบูรณ์

ฉันยังจะเพิ่มว่าสำหรับระบบขนาดเล็กมันค่อนข้างเล็กน้อยที่จะไปและเปลี่ยนชื่อไฟล์และ / หรือสตริงที่นี่และที่นั่นในกรณีที่คุณเปลี่ยนใจเกี่ยวกับการใช้งาน

ในทางตรงกันข้ามแนวโน้มที่ทันสมัยในการพัฒนาระบบที่มีขนาดใหญ่หมายถึงการมีไฟล์ปฏิบัติการหลักโดยไม่ต้องมีส่วนขยายใด ๆ ในขณะที่โมดูลทั้งหมดนั้นขึ้นอยู่กับว่ายังมีส่วนขยายเฉพาะภาษา

ในความเป็นจริงแล้ว Python ต้องการสิ่งนี้จากการออกแบบและโดยปกติแล้วสคริปต์ Python หลัก (อันที่ไม่มีส่วนขยายในชื่อ) จะเป็นเพียงไม่กี่บรรทัดในการเริ่มต้นแอปทั้งหมด


0

หนังสือทั้งหมดบอกคุณว่าใน Unix นามสกุลไฟล์นั้นไม่ได้มีอะไรมากไปกว่าการประชุม ในความเป็นจริงไฟล์หลายประเภทตกอยู่ในหมวดหมู่นี้ ไฟล์ Ruby ใช้หลักการเดียวกันดังนั้นจึงไม่ต้องการนามสกุล. rb คอมไพเลอร์ C ต้องใช้รหัส C ที่ถูกต้องเท่านั้นดังนั้นคุณสามารถตั้งชื่อได้ว่า .watoozy หากคุณต้องการ

ในขณะที่ไม่มีความยับยั้งชั่งใจทางเทคนิคมีข้อ จำกัด ในทางปฏิบัติของหลักการที่น่าประหลาดใจน้อยที่สุด โดยพื้นฐานแล้วจะเป็นเรื่องที่น่าแปลกใจมากที่เห็นรหัสทับทิมในไฟล์. pl ดังนั้นคนทั่วไปจะไม่ทำเช่นนั้น

ข้อยกเว้นหนึ่งข้อสำหรับกฎ

ในบางแอปพลิเคชันเซิร์ฟเวอร์สคริปต์เริ่มต้นอยู่ในไฟล์ที่มีนามสกุลน้อยเพื่อให้ง่ายต่อการเริ่มต้นแอปพลิเคชันเป็นบริการ ไฟล์ดูเหมือนกับคำสั่งที่คอมไพล์อื่น ๆ ในกรณีนั้น ตราบใดที่คุณติดตั้ง Perl มันก็จะทำเช่นนั้นเช่นกัน


คอมไพเลอร์ C ทั่วไปปฏิบัติต่อไฟล์อินพุตของพวกเขาแตกต่างกันขึ้นอยู่กับนามสกุล ยกตัวอย่างเช่นขนม GCC .เป็นรหัสที่มา C, .cpp, .cc, .Cเป็น C ++ รหัสที่มา.oเป็นไฟล์วัตถุที่จะส่งต่อไปยังลิงเกอร์และอื่น ๆ คุณสามารถลบล้างสิ่งนั้นด้วยตัวเลือกบรรทัดคำสั่ง แต่ฉันใช้มันบ่อยครั้งจนฉันจำไม่ได้ว่ามันคืออะไร .cส่วนขยายสำหรับ C ไฟล์ที่มาเป็นสิ่งสำคัญ .plส่วนขยายสำหรับสคริปต์ Perl ปฏิบัติการไม่ได้ (อย่างน้อยใน UNIX เหมือนระบบ)
Keith Thompson

1
@ KeithThompson: อันที่จริงแล้วบนระบบ Unix ที่สอดคล้องกับ SUS ส่วนขยายไฟล์เหล่านั้นเป็นส่วนหนึ่งของข้อกำหนดสำหรับc99คำสั่ง: pubs.opengroup.org/onlinepubs/9699919799/utilities/ …
Jörg W Mittag

-4

ข้อความที่ตัดตอนมาจากหนังสือ "O'Reilly's Learning Perl, 6th Edition" เป็นขยะ การเปรียบเทียบ C กับ perl นั้นไม่เทียบเท่าสำหรับ starters C จะถูกคอมไพล์กับไบนารี่ที่ไม่มีส่วนขยาย

Perl จะไม่ถูกคอมไพล์ดังนั้นโปรแกรมแก้ไขข้อความบางตัวจะต้องมีนามสกุลเพื่อระบุประเภทไฟล์

นอกเหนือจากแนวปฏิบัติที่ดีที่สุดแล้วคุณไม่ควร hardcode ชื่อไฟล์สคริปต์แบบเต็มที่มีส่วนขยายไม่ว่าที่ใดในระบบของคุณคุณควรใช้ symlink หรือนามแฝงนั้นขึ้นอยู่กับระบบปฏิบัติการของคุณ

ในอนาคตหากคุณต้องการเปลี่ยนไฟล์ต้นฉบับคุณจะต้องเปลี่ยน symlink ให้ชี้ไปที่ตำแหน่งใหม่ของคุณ


คำสั่งเกี่ยวกับโปรแกรมแก้ไขข้อความอาจใช้ได้ - แต่ทั้ง emacs และ vim สามารถตรวจจับสคริปต์ Perl ได้โดยไม่ต้องมีนามสกุลพิเศษ การเรียกร้องของคุณเกี่ยวกับ "วิธีปฏิบัติที่ดีที่สุด" จะทำให้คุณมีกำลังใจมากขึ้น ฉันติดตั้งสคริปต์ Perl บนระบบ (Linux) ของฉันโดยไม่มีนามสกุลตลอดเวลาและไม่เคยทำให้เกิดปัญหา
Keith Thompson

ใช่แน่นอนสคริปต์ของคุณจะทำงานหากมีแฮชปัง ( #!) ในบรรทัดคุณพูดถึงว่าคุณทำงานบน linux ซึ่งเยี่ยมมาก .. ในครั้งต่อไปที่คุณติดตั้งแอปพลิเคชันด้วยตัวจัดการแพคเกจให้ความสนใจอย่างใกล้ชิด symlink ไปยังไดเรกทอรี bin ของคุณเพียงแค่เขียนไฟล์โดยตรงไปยังbinไดเรกทอรีของคุณ.. ทุกคนสงสัยว่าทำไม
Aaron Goshine

บางทีนั่นอาจขึ้นอยู่กับผู้จัดการแพ็คเกจ ในระบบ Ubuntu 14.04 ของฉันฉันมี 325 สคริปต์ Perl ติดตั้งโดยตรงภายใต้/usr/binไม่ใช่ลิงก์ ทั้งหมดถูกติดตั้งโดยตัวจัดการแพคเกจของระบบ ผู้จัดการแพ็คเกจมีฐานข้อมูลของตัวเองที่ติดตามตำแหน่งของไฟล์ทั้งหมดสำหรับแต่ละแพ็คเกจ (สำหรับซอฟต์แวร์ที่ฉันสร้างจากซอร์สฉันใช้ symlink) แต่ฉันไม่แน่ใจว่าเกี่ยวข้องกับสคริปต์ Perl หรือไม่ว่าควรมี.plส่วนขยาย
Keith Thompson

ฉันคิดว่ามันอาจจะอยู่ด้านบนจุดที่ฉันพยายามทำคือ
Aaron Goshine

1
ควรจะมีมากกว่าความคิดเห็นที่?
Keith Thompson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.