Gli script Perl non dovrebbero davvero avere estensione?


12

Ho appena iniziato a leggere Learning Perl di O'Reilly , 6a edizione e sono rimasto sorpreso quando mi sono imbattuto in questo estratto.

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

Immaginiamo di averlo digitato nel tuo editor di testo. (Non preoccuparti ancora di cosa significano le parti e di come funzionano. Vedrai quelle in un momento.) In genere puoi salvare quel programma con qualsiasi nome desideri. Perl non richiede alcun tipo speciale di nome file o estensione, ed è meglio non usare affatto un'estensione.

Perché è meglio non avere estensione? Immagina di aver scritto un programma per calcolare i punteggi di bowling e di aver detto a tutti i tuoi amici che si chiama bowling.plx. Un giorno decidi di riscriverlo in C. Lo chiami ancora con lo stesso nome, sottintendendo che è ancora scritto in Perl? O dici a tutti che ha un nuovo nome? (E non chiamarlo bowling.c, per favore!) La risposta è che non è affar loro in che lingua è scritto, se lo stanno semplicemente usando. Quindi, in primo luogo, avrebbe dovuto essere chiamato semplicemente bowling.

Questa è l'unica fonte che ho visto con questa vista, tutto il resto che ho letto ha supportato l'estensione .pl. Non sono ancora un programmatore Perl e volevo sapere qual era il punto di vista della community su questo argomento prima di prendere l'abitudine.


Come spiegano le risposte, l'estensione non è importante. Per gli script (incluso Perl), l'importante è la linea shebang .

1
No signore, non sono d'accordo. Senza un'estensione di file come fanno gli editor IDE e programmatori a decidere l'evidenziazione della sintassi?
GrandmasterB,

3
@GrandmasterB guardando la linea shebang o leggendo i modelli. Non userei mai .plun'estensione per i programmi che vorrei distribuire (che l'informazione è rumore, non segnale), ma è un utile promemoria per gli script locali. Ad ogni modo, questa discussione è irrilevante per> 90% del codice Perl poiché si trova in un modulo ( .pmestensione richiesta) o in un test ( .testensione abituale).
amon,

1
@GrandmasterB Sviluppo su Linux e sia Vim che Kate identificano correttamente un file che inizia con la riga #!/usr/bin/env perlcome script Perl se il file non ha estensione in conflitto (come .cpp). Il fileprogramma (utilizzato per dedurre un tipo MIME per un determinato input) deduce correttamente text/x-perlindipendentemente dall'estensione.
amon,

3
Da qualche parte in là ho pensato abbiamo notato che il .pl estensione era per p Erl l ibraries, e in qualche modo trasformato in ciò che le persone utilizzate per i programmi.
brian d foy,

Risposte:


14

I consigli nel libro sono perfettamente validi - almeno per i sistemi simili a UNIX. L'esecuzione dello script è controllata dalla #!riga, non dalla parte dell'estensione del nome del file. L'uso di un'estensione speciale per gli script Perl espone informazioni che non dovrebbero essere importanti per chiunque esegua lo script.

Windows è una questione diversa. Windows non supporta il #!meccanismo; invece, il metodo utilizzato per aprire un file dipende dall'estensione. Ad esempio, la shell di Windows potrebbe essere configurata in modo tale che facendo doppio clic su un .plfile (o eseguendolo da un prompt) lo passerà come argomento all'interprete Perl. L'installazione di un sistema Perl probabilmente lo configurerà automaticamente.

Per gli script Perl destinati a essere portatili, il .plsuffisso richiesto da Windows potrebbe "infiltrarsi" in sistemi simili a UNIX. Probabilmente è meglio avere un metodo di installazione specifico del sistema che scelga un nome appropriato per lo script mentre viene installato.

Su UNIX-like sistemi, un .plprolungamento è per lo più innocui, e se lo trovate utile come promemoria di ciò che il linguaggio è usato da un particolare script (forse avete una collezione di .pl, .py, .sh, e .rbgli script), allora si può fare. Ma ci sono degli svantaggi di questo approccio, come descritto nel libro: se reimplementi uno script in una lingua diversa, dovrai cambiare il nome e aggiornare tutto ciò che lo chiama.

(I moduli Perl devono avere .pmun'estensione in modo che Perl possa trovarli. Ad esempio, questo:

use Foo::Bar;

farà sì che l'interprete cerchi un file chiamato Bar.pmin una directory nominata Fooin una delle directory elencate @INCnell'array. Ma i .pmfile non sono fatti per essere eseguiti direttamente.)

Questa è l'unica fonte che ho visto con questa vista, tutto il resto che ho letto ha supportato l' .plestensione.

Lo trovo sorprendente. La maggior parte dei consigli che ho visto dice di non usare l' .plestensione per gli script eseguibili.


1

Non importa

#!/usr/bin/perl

indica al sistema quale programma utilizzare per eseguire il codice.

se lo hai cambiato in

#!/usr/bin/bash

o

#!/usr/bin/python

useresti un interprete diverso.

Avere l'estensione è totalmente facoltativo e il punto in cui l'utente non ha bisogno di conoscere la lingua è corretto al 100% nella maggior parte dei casi.

correre add 2 3e tornare indietro 5 è tutto ciò che mi interessa (come utente).

L'unica volta che aggiungo un'estensione agli script è se ho bisogno che l'utente finale (alcune volte io stesso) conosca la lingua per qualche motivo.

esempio.sh o esempio.pl per mostrare a diversi modi per eseguire la stessa attività.

Detto questo, è più comune non avere un'estensione, ma è tutto gusto.


1

L'estratto fa davvero un consiglio perfettamente valido.

Vorrei anche aggiungere che per un sistema più piccolo è abbastanza banale ripassare e rinominare alcuni file e / o stringhe qua e là in caso di ripensamenti sull'implementazione.

D'altra parte, una tendenza moderna nello sviluppo di sistemi di grandi dimensioni implica avere il file eseguibile principale senza alcuna estensione mentre tutti i moduli da cui dipende hanno ancora l'estensione specifica della lingua.

In effetti, Python lo richiede in base alla progettazione e di solito lo script Python principale (quello senza estensione nel nome) è solo poche righe che avviano l'intero app.


0

Tutto ciò che il libro ti dice è che su Unix, l'estensione del file non è altro che una convenzione. In realtà, molti tipi di file rientrano in questa categoria. I file Ruby usano la stessa convenzione quindi non hanno bisogno dell'estensione .rb. I compilatori C richiedono solo un codice C valido, quindi puoi nominarli .watoozy se lo desideri.

Sebbene non vi siano restrizioni tecniche, esiste il vincolo pratico del principio della minima sorpresa . Fondamentalmente, sarebbe molto sorprendente vedere il codice ruby ​​in un file .pl, quindi la gente generalmente non lo fa.

L'unica eccezione alla regola

In alcune applicazioni server, lo script di avvio si trova in un file senza estensione per facilitare l'avvio dell'applicazione come servizio. Il file assomiglia a qualsiasi altro comando compilato in quel caso. Finché hai installato Perl, si comporterà anche in questo modo.


I compilatori C di solito trattano i loro file di input in modo diverso a seconda dell'estensione. Ad esempio, tratta gcc .come codice sorgente C, .cpp, .cc, .Ccome codice sorgente C ++, .ocome un file oggetto da passare al linker, e così via. Puoi sovrascriverlo con un'opzione da riga di comando, ma l'ho usato così raramente che non ricordo di cosa si tratta. L' .cestensione per i file di origine C è importante. L' .plestensione per gli script Perl eseguibili non è (almeno su sistemi simili a UNIX).
Keith Thompson,

1
@KeithThompson: in effetti, su un sistema Unix conforme a SUS, quelle estensioni di file fanno anche parte delle specifiche per il c99comando: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
Jörg W Mittag

-4

L'estratto del libro "O'Reilly's Learning Perl, 6a edizione" è spazzatura. Il confronto tra C e perl non è equivalente, poiché i principianti C saranno compilati in un binario, che non ha estensione.

Perl non verrà compilato, quindi alcuni editor di testo avranno bisogno dell'estensione per identificare il tipo di file.

A parte le migliori pratiche, non è necessario codificare il nome completo dello script con estensione in qualsiasi punto del sistema. Utilizzare sempre un collegamento simbolico o un alias in base al sistema operativo in uso.

In futuro, se è necessario modificare il file originale, è sufficiente modificare il collegamento simbolico per puntare alla nuova posizione.


L'affermazione sugli editor di testo potrebbe essere valida, ma sia emacs che vim sono in grado di rilevare uno script Perl senza un'estensione speciale. La tua richiesta di "best practice" sarebbe più convincente con un po 'di supporto. Installo continuamente gli script Perl sui miei sistemi (Linux) senza estensioni e non ha mai causato problemi.
Keith Thompson,

Sì, ovviamente il tuo script verrà eseguito se ha l'hash bang ( #!) in linea, dici che lavori su Linux che è fantastico .. la prossima volta che installi un'applicazione con un gestore di pacchetti presta molta attenzione a come crea anche un link simbolico alla tua directory bin invece di scrivere il file direttamente nella tua bindirectory .. ogni meraviglia del perché.
Aaron Goshine,

Forse dipende dal gestore dei pacchetti? Sul mio sistema Ubuntu 14.04, ho 325 script Perl installati direttamente sotto /usr/bin, non come collegamenti simbolici; sono stati tutti installati dal gestore dei pacchetti del sistema. Il gestore pacchetti ha un proprio database che tiene traccia delle posizioni di tutti i file per ciascun pacchetto. (Per il software che costruisco dal sorgente, utilizzo i link simbolici.) Ma non sono sicuro di cosa abbia a che fare con se gli script Perl debbano avere .plun'estensione.
Keith Thompson,

Penso che potrebbe essere andato in cima qui, il punto che stavo cercando di chiarire è.
Aaron Goshine,

1
Doveva esserci di più in quel commento?
Keith Thompson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.