Чи справді сценарії Perl не мають розширення?


12

Я щойно почав читати навчальний Perl, 6-е видання O'Reilly , і здивувався, коли натрапив на цей уривок.

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

Давайте уявимо, що ви це ввели у своєму текстовому редакторі. (Ще не хвилюйтеся про те, що означають деталі та як вони працюють. Про них ви побачите через мить.) Зазвичай ви можете зберегти цю програму під будь-яким бажанням. Perl не вимагає спеціального імені файлу чи розширення, і краще взагалі не використовувати розширення.

Чому краще не мати розширення? Уявіть, що ви написали програму для обчислення балів у боулінгу, і ви сказали всім своїм друзям, що це називається bowling.plx. Одного разу ви вирішили переписати його на C. Ви все ще називаєте його тим же ім’ям, маючи на увазі, що він все ще написаний на Perl? Або ви кажете всім, що у нього нове ім’я? (І не називайте це bowling.c, будь ласка!) Відповідь полягає в тому, що ніхто не займається їхньою справою, на якій мові написано, якщо вони просто нею користуються. Тож його треба було б назвати в першу чергу просто боулінг.

Це єдине джерело, яке я бачив із цим поглядом, все інше, що я прочитав, підтримує розширення .pl. Я ще не програміст Perl, і мені хотілося дізнатися, який погляд на це громада мала до того, як увійшла у звичку.


Як пояснюються відповіді, розширення не важливо. Для сценаріїв (включаючи Perl) важливим є рядок shebang .

1
Ні, пане, не згоден. Як без розширення файлу редактори IDE та програмістів вирішують питання виділення синтаксису?
GrandmasterB

3
@GrandmasterB, дивлячись на лінію shebang або читаючи манекени. Я б ніколи не використовував .plрозширення для програм, які хотів би поширити (ця інформація є шумом, а не сигналом), але це корисне нагадування для місцевих сценаріїв. У будь-якому випадку ця дискусія не має значення для> 90% коду Perl, оскільки вона знаходиться або в модулі ( .pmнеобхідне розширення), або в тесті ( .tрозширення звичайне).
амон

1
@GrandmasterB Я розробляю в Linux, і Vim і Kate правильно ідентифікують файл, починаючи з рядка, #!/usr/bin/env perlяк сценарій Perl, якщо файл не має суперечливого розширення (наприклад .cpp). fileПрограма (використовується для виведення типу MIME для даного входу) правильно виводить text/x-perlнезалежно від розширення.
амон

3
Де - то там , я думав , що ми вже відзначали , що .pl розширення було для р Ерл л ibraries, і яким - то чином перетворився в те , що раніше люди для програм.
Брайан d foy

Відповіді:


14

Порада в книзі цілком справедлива - принаймні для UNIX-подібних систем. Виконання сценарію контролюється #!рядком, а не розширенням частини імені файлу. Використання спеціального розширення для скриптів 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 лікує .як вихідний код С, .cpp, .cc, .Cяк вихідний код C ++, .oа об'єктний файл буде переданий линкера, і так далі. Ви можете змінити це за допомогою параметра командного рядка, але я його використовував так рідко, що я не пам'ятаю, що це таке. .cРозширення для вихідних файлів C має важливе значення. .plРозширення для виконуваних скриптів на Perl не є (принаймні , на UNIX-подібних системах).
Кіт Томпсон

1
@KeithThompson: насправді у сумісній із SUS системі Unix ці розширення файлів навіть є частиною специфікації для c99команди: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
Jörg W

-4

Уривок із книги "Навчання Per'l, 6-е видання" - це сміття. Порівняння C з perl не рівнозначно, для початківців C буде компілюватися у двійковий, який не має розширення.

Perl не буде компілюватися, тому деяким текстовим редакторам знадобиться розширення, щоб визначити тип файлу.

Окрім найкращої практики, ви не повинні твердо кодувати повне ім'я файлу скрипта з розширенням у будь-якій точці вашої системи, ви завжди повинні використовувати симпосилання або псевдонім залежно від вашої операційної системи.

Надалі, якщо вам потрібно змінити оригінальний файл, вам потрібно лише змінити посилання, щоб вказати на ваше нове місце.


Заява про текстові редактори може бути дійсною, але і emacs, і vim здатні виявити скрипт Perl без спеціального розширення. Ваше твердження про "кращу практику" було б переконливішим за певної підтримки. Я постійно встановлюю сценарії Perl у своїх (Linux) системах без розширень, і це ніколи не спричиняло проблем.
Кіт Томпсон

Так, звичайно, ваш сценарій запуститься, якщо в ньому буде хеш-баг ( #!), ви згадаєте, що ви працюєте на Linux, що чудово. Наступного разу, коли ви встановите програму з менеджером пакунків, зверніть пильну увагу на те, як він також створюється Символьне посилання на каталог бін замість того, щоб просто записати файл безпосередньо у binкаталог.
Аарон Гошине

Можливо, це залежить від менеджера пакунків? У моїй системі Ubuntu 14.04 у мене встановлено 325 сценаріїв Perl безпосередньо під /usr/bin, а не як посилання; всі вони були встановлені менеджером пакунків системи. Менеджер пакунків має власну базу даних, яка відслідковує розташування всіх файлів для кожного пакету. (Для програмного забезпечення, яке я будую з джерела, я використовую посилання.) Але я не впевнений, що це стосується того, чи повинні сценарії Perl мати .plрозширення.
Кіт Томпсон

Я думаю, що тут я міг би перейти до вершини.
Аарон Гошине

1
Чи повинно було бути більше цього коментаря?
Кіт Томпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.