Haruskah skrip Perl benar-benar tidak memiliki ekstensi?

12

Saya baru saja mulai membaca O'Reilly Learning Perl, Edisi 6 dan terkejut ketika saya menemukan kutipan ini.

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

Bayangkan Anda telah mengetiknya di editor teks Anda. (Jangan khawatir tentang apa arti bagian-bagian itu dan bagaimana mereka bekerja. Anda akan segera melihatnya tentang hal itu.) Anda umumnya dapat menyimpan program itu dengan nama apa pun yang Anda inginkan. Perl tidak memerlukan jenis nama file atau ekstensi khusus, dan lebih baik tidak menggunakan ekstensi sama sekali.

Mengapa lebih baik tidak memiliki ekstensi? Bayangkan bahwa Anda telah menulis sebuah program untuk menghitung skor bowling dan Anda telah memberi tahu semua teman Anda bahwa itu disebut bowling.plx. Suatu hari Anda memutuskan untuk menulis ulang dalam C. Apakah Anda masih menyebutnya dengan nama yang sama, menyiratkan bahwa itu masih ditulis dalam Perl? Atau apakah Anda memberi tahu semua orang bahwa itu memiliki nama baru? (Dan jangan menyebutnya bowling. C, kumohon!) Jawabannya adalah bukan urusan mereka bahasa apa yang digunakan, jika mereka hanya menggunakannya. Jadi itu seharusnya disebut bowling.

Ini adalah satu-satunya sumber yang saya lihat dengan tampilan ini, semua yang saya baca telah mendukung ekstensi .pl. Saya belum menjadi programmer Perl, dan saya ingin tahu apa pandangan masyarakat tentang ini sebelum saya terbiasa.

Jared
sumber
Seperti yang dijelaskan jawabannya, ekstensi itu tidak penting. Untuk skrip (termasuk Perl), yang penting adalah baris shebang .
1
Tidak pak, jangan setuju. Tanpa ekstensi file, bagaimana cara editor IDE dan programer memutuskan penyorotan sintaksis?
GrandmasterB
3
@GrandmasterB dengan melihat garis shebang, atau dengan membaca modelines. Saya tidak akan pernah menggunakan .plekstensi untuk program yang ingin saya distribusikan (informasi itu berisik, bukan sinyal), tapi ini pengingat yang berguna untuk skrip lokal. Bagaimanapun, diskusi ini tidak relevan untuk> 90% dari kode Perl karena itu baik dalam modul ( .pmekstensi diperlukan) atau tes ( .tekstensi adat).
amon
1
@ GrandmasterB Saya kembangkan di Linux, dan baik Vim maupun Kate mengidentifikasi dengan benar file yang dimulai dengan baris #!/usr/bin/env perlsebagai skrip Perl jika file tersebut tidak memiliki ekstensi yang bertentangan (seperti .cpp). The fileProgram (digunakan untuk menyimpulkan jenis MIME untuk masukan yang diberikan) dengan benar menyimpulkan text/x-perltanpa ekstensi.
amon
3
Di suatu tempat di sana saya pikir kami mencatat bahwa .pl ekstensi adalah untuk p Erl l ibraries, dan entah bagaimana berubah menjadi apa yang orang digunakan untuk program.
brian d foy

Jawaban:

14

Saran dalam buku ini benar-benar valid - setidaknya untuk sistem mirip UNIX. Eksekusi skrip dikendalikan oleh #!baris, bukan oleh bagian ekstensi dari nama file. Menggunakan ekstensi khusus untuk skrip Perl memperlihatkan informasi yang seharusnya tidak penting bagi siapa pun yang menjalankan skrip.

Windows adalah masalah yang berbeda. Windows tidak mendukung #!mekanisme; sebaliknya, metode yang digunakan untuk membuka file tergantung pada ekstensi. Misalnya, shell Windows mungkin dikonfigurasikan sehingga mengklik dua kali pada .plfile (atau menjalankannya dari prompt) akan memberikannya sebagai argumen kepada penerjemah Perl. Menginstal sistem Perl mungkin akan mengaturnya untuk Anda secara otomatis.

Untuk skrip Perl yang dimaksudkan untuk portable, .plakhiran yang dibutuhkan oleh Windows mungkin "bocor" ke sistem mirip UNIX. Mungkin sebaiknya memiliki metode instalasi khusus sistem yang memilih nama yang sesuai untuk skrip saat diinstal.

Pada UNIX-seperti sistem, sebuah .plekstensi sebagian besar tidak berbahaya, dan jika Anda merasa berguna sebagai pengingat bahasa apa yang digunakan oleh script tertentu (mungkin Anda memiliki koleksi .pl, .py, .sh, dan .rbscript), maka Anda bisa melakukan itu. Tetapi ada beberapa kelemahan dari pendekatan itu, seperti dijelaskan dalam buku ini: jika Anda menerapkan kembali skrip dalam bahasa yang berbeda, Anda harus mengubah nama dan memperbarui apa pun yang menyebutnya.

( Modul Perl perlu memiliki .pmekstensi agar Perl dapat menemukannya. Misalnya, ini:

use Foo::Bar;

akan menyebabkan penerjemah untuk mencari file yang bernama Bar.pmdalam direktori aa bernama di Foobawah salah satu direktori yang tercantum dalam @INCarray. Tetapi .pmfile tidak dimaksudkan untuk dieksekusi secara langsung.)

Ini adalah satu-satunya sumber yang saya lihat dengan tampilan ini, semua yang saya baca telah mendukung .plekstensi.

Saya menemukan itu mengejutkan. Sebagian besar saran yang saya lihat mengatakan untuk tidak menggunakan .plekstensi untuk skrip yang dapat dieksekusi.

Keith Thompson
sumber
1

Tidak masalah

#!/usr/bin/perl

memberitahu sistem program apa yang digunakan untuk menjalankan kode.

jika Anda mengubahnya menjadi

#!/usr/bin/bash

atau

#!/usr/bin/python

Anda akan menggunakan juru bahasa yang berbeda.

Memiliki ekstensi benar-benar opsional, dan poin bahwa pengguna tidak perlu tahu bahasa adalah 100% benar dalam banyak kasus.

menjalankan add 2 3dan mendapatkan kembali 5 adalah semua yang saya pedulikan (sebagai pengguna).

Satu-satunya waktu saya menambahkan ekstensi ke skrip adalah jika saya membutuhkan pengguna akhir (beberapa kali saya sendiri) untuk mengetahui bahasa karena beberapa alasan.

example.sh atau example.pl untuk menunjukkan cara yang berbeda untuk menyelesaikan tugas yang sama.

Semua yang dikatakan, lebih umum untuk tidak memiliki ekstensi, tapi semua rasa.

kapas
sumber
1

Kutipan ini memang memberikan saran yang sangat valid.

Saya juga akan menambahkan, bahwa untuk sistem yang lebih kecil itu cukup sepele untuk pergi dan mengganti nama beberapa file dan / atau string di sana-sini jika berubah pikiran tentang implementasi.

Di sisi lain, tren modern dalam mengembangkan sistem largish menyiratkan memiliki file yang dapat dieksekusi utama tanpa ekstensi sementara semua modul tergantung masih memiliki ekstensi khusus bahasa.

Faktanya, Python membutuhkan ini dengan desain, dan biasanya skrip Python utama (yang tanpa ekstensi dalam nama) hanya beberapa baris bootstrap seluruh aplikasi.

Alexander Shcheblikin
sumber
0

Semua buku ini memberi tahu Anda bahwa pada Unix, ekstensi file tidak lebih dari sebuah konvensi. Pada kenyataannya, banyak jenis file termasuk dalam kategori ini. File Ruby menggunakan konvensi yang sama sehingga mereka tidak memerlukan ekstensi .rb. Kompiler C hanya perlu kode C yang valid, sehingga Anda dapat menamainya .watoozy jika Anda mau.

Sementara tidak ada pengekangan teknis, ada kendala praktis dari prinsip paling tidak mengejutkan . Pada dasarnya, akan sangat mengejutkan melihat kode ruby ​​dalam file .pl, jadi orang-orang biasanya tidak melakukannya.

Satu-satunya pengecualian pada aturan

Di beberapa aplikasi server, skrip start up dalam file ekstensi-kurang untuk membuatnya lebih mudah untuk memulai aplikasi sebagai layanan. File tersebut terlihat seperti sembarang perintah terkompilasi lainnya dalam hal ini. Selama Anda telah menginstal Perl, ia akan berperilaku seperti itu juga.

Berin Loritsch
sumber
Kompiler C biasanya memperlakukan file input mereka secara berbeda tergantung pada ekstensi. Misalnya, gcc memperlakukan .sebagai kode sumber C, .cpp, .cc, .CC ++ kode sumber, .osebagai file objek untuk diteruskan kepada linker, dan sebagainya. Anda dapat menimpanya dengan opsi baris perintah, tetapi saya sudah jarang menggunakannya sehingga saya tidak ingat apa itu. The .cekstensi untuk C file sumber penting. The .plekstensi untuk script Perl executable tidak (setidaknya pada UNIX-seperti sistem).
Keith Thompson
1
@KeithThompson: pada kenyataannya, pada sistem Unix yang memenuhi SUS, ekstensi file tersebut bahkan merupakan bagian dari spesifikasi untuk c99perintah: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
Jörg W Mittag
-4

Kutipan, dari buku "O'Reilly Learning Perl, Edisi ke-6" adalah sampah. Membandingkan C ke perl tidak sama, untuk permulaan C akan dikompilasi ke biner, yang tidak memiliki ekstensi.

Perl tidak akan dikompilasi sehingga beberapa editor teks akan memerlukan ekstensi untuk mengidentifikasi tipe file.

Sebagai bagian dari praktik terbaik Anda tidak boleh hardcode nama file script lengkap dengan ekstensi di mana saja di sistem Anda, Anda harus selalu menggunakan symlink atau alias tergantung pada sistem operasi Anda.

Di masa depan jika Anda perlu mengubah file asli, Anda hanya perlu mengubah symlink untuk menunjuk ke lokasi baru Anda.

Aaron Goshine
sumber
Pernyataan tentang editor teks mungkin valid - tetapi baik emacs dan vim mampu mendeteksi skrip Perl tanpa ekstensi khusus. Klaim Anda tentang "praktik terbaik" akan lebih meyakinkan dengan beberapa dukungan. Saya menginstal skrip Perl pada sistem (Linux) saya tanpa ekstensi setiap saat, dan itu tidak pernah menyebabkan masalah.
Keith Thompson
Ya, tentu saja skrip Anda akan berjalan jika hash bang ( #!) sejalan, Anda menyebutkan bahwa Anda bekerja di linux yang hebat .. lain kali Anda menginstal aplikasi dengan manajer paket perhatikan bagaimana ia juga membuat symlink ke direktori bin Anda bukan hanya menulis file langsung ke bindirektori Anda .. setiap heran mengapa.
Aaron Goshine
Mungkin itu tergantung pada manajer paket? Pada sistem Ubuntu 14.04 saya, saya memiliki 325 skrip Perl yang diinstal langsung di bawah /usr/bin, bukan sebagai symlink; mereka semua diinstal oleh manajer paket sistem. Manajer paket memiliki basis datanya sendiri yang melacak lokasi semua file untuk setiap paket. (Untuk perangkat lunak yang saya buat dari sumber, saya menggunakan symlinks.) Tapi saya tidak yakin apa yang harus dilakukan dengan apakah skrip Perl harus memiliki .plekstensi.
Keith Thompson
Saya pikir mungkin sudah di atas sini, poin yang saya coba buat adalah.
Aaron Goshine
1
Apakah seharusnya ada lebih banyak komentar itu?
Keith Thompson