Flag di Perl -pe, -pi, -p, -w, -d, -i, -t?


107

Ho visto molti modi per eseguire codice o script Perl, con flag diversi. Tuttavia, quando provo a cercare su Google il significato di ogni flag, ottengo risultati principalmente su siti Perl generici e non si trovano informazioni specifiche sui flag o sul loro utilizzo.

Di seguito sono elencate le bandiere che incontro più spesso e non ho la più pallida idea di cosa significano:

  • perl -pe
  • perl -pi
  • perl -p
  • perl -w
  • perl -d
  • perl -i
  • perl -t

Ti sarò molto grato se mi dicessi cosa significano ognuno di questi e alcuni casi d'uso per loro, o almeno mi dici un modo per scoprire il loro significato.


21
cercare su Google le risposte di base su perl ti porterà spesso ad alcuni siti davvero inutili. controlla sempre prima la documentazione di perl.
ysth


2
Distaccato. In questo caso, perldoc perlrunha un elenco di tutte le opzioni della riga di comando che Perl accetta.
Sherm Pendley

1
Problema di Google: il segno meno viene interpretato da Google nel senso di "escludi questo termine". Per evitare questo comportamento, inserire il termine contenente il segno meno tra virgolette.
Roger Krueger

Risposte:


147

Sì, Google è notoriamente difficile per la ricerca di punteggiatura e, purtroppo, Perl non sembrano essere per lo più fatta di punteggiatura :-)

Le opzioni della riga di comando sono tutte dettagliate in perlrun . (disponibile dalla riga di comando chiamando perldoc perlrun)

Entrando brevemente nelle opzioni, una per una:

-p: inserisce un ciclo di stampa attorno al comando in modo che agisca su ciascuno
    riga di input standard. Usato principalmente in modo che Perl possa battere il
    pantaloni fuori awk in termini di potenza E semplicità :-)
-n: inserisce un ciclo non stampabile attorno al comando.
-e: consente di fornire il programma piuttosto come argomento
    che in un file. Non vuoi dover creare uno script
    file per ogni piccola riga di Perl.
-i: modifica il file di input sul posto (facendo un backup del file
    originale). Comodo per modificare i file senza la {copia,
    elimina-originale, rinomina} processo.
-w: attiva alcuni avvisi. Qualsiasi buon programmatore Perl lo userà.
-d: viene eseguito con il debugger Perl. Per eseguire il debug del codice Perl,
    ovviamente.
-t: tratta alcuni codici "contaminati" (dubbi) come avvertimenti (appropriati
    la modalità di contaminazione commetterà un errore su questo codice dubbio). Usato per il manzo
    sulla sicurezza Perl, specialmente quando si esegue codice per altri
    utenti, come script setuid o materiale web.

1
Non ho notato che ti sei riferito perldoc perlrun. Ho cancellato la mia risposta. :-)
Alan Haggai Alavi

4
-wè generalmente da evitare, in realtà, poiché abilita gli avvisi per tutto il codice, inclusi i moduli CPAN che non sono stati scritti tenendo presenti gli avvisi. I risultati sono generalmente piuttosto rumorosi, oltre che abbastanza inutili.
duskwuff -inattivo-

9
-wè generalmente evitato, ma dovrebbe essere sostituito con use warningsnel tuo codice.
plusplus

6
@duskwuff: In generale sono d'accordo, e lo faccio use warningsnel mio codice, ma -w ha un uso - aiuta a eliminare i moduli CPAN scritti male. :-)
Sherm Pendley

2
@IanBytchek Gli argomenti che possono / devono accettare un parametro aggiuntivo non possono essere all'interno di un elenco compresso. -iaccetta un'estensione per il backup. -eaccetta un comando perl. In -0ep che stai dicendo a perl che 'p' è un comando perl invece di un argomento. Non funzionerà affatto bene.
giovedì

10

Il -pflag fondamentalmente esegue lo script con

while (<>) {
# exec here
}
continue {
    print or die "-p destination: $!\n";
}

-e ti permette di passare uno script a STDIN

perl -e '$x = "Hello world!\n"; print $x;'

-iindica all'interprete che tutti i dati passati STDINdallo script in esecuzione devono essere eseguiti sul posto.

-wè uguale a use warnings;, ma in un ambito globale piuttosto che locale

-d esegue il debugger Perl


2
-wnon è proprio la stessa cosa use warnings, quest'ultimo è limitato al file locale
plusplus

plusplus, true, patching risposta.
zellio

2
Passare lo script come argomento non equivale a passarlo su STDIN. -i prende i nomi dei file dall'elenco degli argomenti, non dallo stdin. Anche se STDIN è spesso associato al terminale di controllo, ed è ereditato dalla shell che legge stdin e imposta l'elenco di argomenti in perl, NON sono la stessa cosa.
William Pursell

8

Altri hanno menzionato perlrun. Se usi B :: Deparse, puoi vedere cosa significa (per la maggior parte delle cose):

$ perl -MO=Deparse   -p  -e 1
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

1 è rappresentato da "???", perché è ottimizzato.

$ perl -MO=Deparse   -p -i  -e 1
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

-i imposta $ ^ Mi piace

$ perl -MO=Deparse   -p -i.bak  -e 1
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Ma ricorda, <ARGV> usa 2 argomenti aperti, quindi non avere nomi di file che iniziano con > <o iniziano / finiscono con |.


4

C'è anche una bandiera importante -nche non è menzionata nell'elenco.

-nfunziona come -p, solo che non stampa $_per impostazione predefinita. Questo può essere molto utile per filtrare i file di testo.

In questo modo Perl può sostituire grep | sedin una sola riga.

Per esempio:

perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt

Stamperà ogni valore intero trovato dopo "Messaggi letti:" e niente di più.


Questo può essere ulteriormente semplificato. Non è necessario "print" $ 1 \ n "". Puoi semplicemente usare "print" invece.
elisio divorato

No, non può, non print $1è la stessa cosa di print( print $_).
rustyx

Può: echo abc | perl -nw -e "print if (1)"stamperà abc. Non c'è bisogno del $1riferimento.
elisio divorato

@devouredelysium: Sì, ma non vuole stampare l'intera riga, ma solo il numero corrispondente all'espressione regolare.
Ingo Blechschmidt
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.