Flagi Perla -pe, -pi, -p, -w, -d, -i, -t?

107

Widziałem wiele sposobów uruchamiania kodu lub skryptów Perla z różnymi flagami. Jednak kiedy próbuję wyszukać w Google, co oznacza każda flaga, otrzymuję wyniki głównie do ogólnych witryn Perla i nie znajdują tam żadnych konkretnych informacji dotyczących flag ani ich użycia.

Poniżej flagi, które napotykam najczęściej i nie mam pojęcia, co oznaczają:

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

Będę bardzo wdzięczny, jeśli powiesz mi, co każdy z nich oznacza i jakie są ich przypadki użycia, lub przynajmniej podasz mi, w jaki sposób mogę znaleźć ich znaczenie.

Tudor Constantin
źródło
21
szukanie podstawowych odpowiedzi na temat Perla często prowadzi do naprawdę nieprzydatnych witryn. zawsze najpierw sprawdź własną dokumentację perla.
ysth
3
Oddelegowany. W tym przypadku perldoc perlrunzawiera listę wszystkich opcji wiersza poleceń, które akceptuje Perl.
Sherm Pendley,
1
Problem z Google: znak minus jest interpretowany przez Google jako „wyklucz ten termin”. Aby uniknąć tego zachowania, termin zawierający znak minus należy umieścić w cudzysłowie.
Roger Krueger,

Odpowiedzi:

147

Tak, Google notorycznie ma trudności z wyszukiwaniem interpunkcji i niestety wydaje się , że Perl składa się głównie z interpunkcji :-)

Wszystkie przełączniki wiersza poleceń są szczegółowo opisane w perlrun . (dostępne z linii poleceń, dzwoniąc perldoc perlrun)

Przechodząc do opcji krótko, jeden po drugim:

-p: umieszcza pętlę drukowania wokół twojego polecenia, tak aby działała na każdym z nich
    linia standardowego wejścia. Używany głównie, aby Perl mógł pokonać
    spodnie off awk pod względem mocy i prostoty :-)
-n: umieszcza niedrukowalną pętlę wokół polecenia.
-e: Pozwala raczej na podanie programu jako argumentu
    niż w pliku. Nie chcesz tworzyć skryptu
    plik dla każdego małego jednowierszowego pliku Perl.
-i: modyfikuje plik wejściowy na miejscu (tworząc kopię zapasową
    oryginalny). Przydatne do modyfikowania plików bez {copy,
    delete-original, rename} proces.
-w: aktywuje niektóre ostrzeżenia. Każdy dobry programista w Perlu będzie tego używał.
-d: działa w debugerze Perla. Do debugowania kodu Perla,
    oczywiście.
-t: Traktuje pewien "skażony" (wątpliwy) kod jako ostrzeżenia (właściwe
    tryb skażenia spowoduje błąd w tym wątpliwym kodzie). Używany do wołowiny
    up Bezpieczeństwo Perla, zwłaszcza podczas uruchamiania kodu dla innych
    użytkowników, takich jak skrypty setuid lub rzeczy internetowe.
paxdiablo
źródło
1
Nie zauważyłem, o czym mówiłeś perldoc perlrun. Usunąłem swoją odpowiedź. :-)
Alan Haggai Alavi
4
-wgeneralnie należy go unikać, ponieważ umożliwia ostrzeżenia dla całego kodu, w tym modułów CPAN, które nie zostały napisane z myślą o ostrzeżeniach. Wyniki są generalnie dość hałaśliwe, a także całkiem bezużyteczne.
duskwuff
9
-wjest generalnie unikany, ale należy go zastąpić use warningswe własnym kodzie.
plusplus
6
@duskwuff: Generalnie się zgadzam i robię to use warningsw swoim własnym kodzie, ale -w ma swoje zastosowanie - pomaga usunąć źle napisane moduły CPAN. :-)
Sherm Pendley
2
@IanBytchek Argumenty, które mogą / muszą przyjmować dodatkowy parametr, nie mogą znajdować się wewnątrz skompresowanej listy. -iprzyjmuje rozszerzenie kopii zapasowej. -eprzyjmuje polecenie Perla. W -0ep mówisz Perl, że „p” jest poleceniem Perl zamiast argumentu. To wcale nie wyjdzie dobrze.
tjd
10

-pFlag zasadzie uruchamia skrypt

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

-e umożliwia przekazanie skryptu do STDIN

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

-iwskazuje interpreterowi, że wszystkie dane przekazywane STDINprzez skrypt wykonawczy mają być wykonywane w miejscu.

-wjest taki sam jak use warnings;, ale w zasięgu globalnym, a nie lokalnym

-d uruchamia debuger Perla

zellio
źródło
2
-wnie jest dokładnie tym samym, co use warnings, ten ostatni jest ograniczony do pliku lokalnego
plusplus.
plusplus, prawda, łatwa odpowiedź.
zellio,
2
Przekazanie skryptu jako argumentu to nie to samo, co przekazanie go do STDIN. -i pobiera nazwy plików z listy argumentów, a nie z standardowego wejścia. Chociaż STDIN jest często powiązany z terminalem sterującym i jest dziedziczony z powłoki, która czyta stdin i ustawia listę argumentów na perl, to NIE są tym samym.
William Pursell
8

Inni wspominali o perlrunie. Jeśli używasz B :: Deparse, możesz zobaczyć, co to oznacza (dla większości rzeczy):

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

1 jest reprezentowane przez „???”, ponieważ jest zoptymalizowane.

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

-i ustawia $ ^ I, jak

$ 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

Ale pamiętaj, <ARGV> używa 2-argumentowego otwarcia, więc nie używaj nazw plików, które zaczynają się > <lub zaczynają / kończą się |.

liame
źródło
4

Jest też jedna ważna flaga, -nktórej nie ma na liście.

-ndziała tak samo jak -p, tylko że $_domyślnie nie drukuje . Może to być bardzo przydatne w filtrowaniu plików tekstowych.

W ten sposób Perl może zastąpić grep | sedpojedynczą linijkę.

Na przykład:

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

Wypisze każdą liczbę całkowitą znalezioną po „Przeczytanych wiadomościach:” i nic więcej.

rustyx
źródło
Można to jeszcze bardziej uprościć. Nie ma potrzeby "print" $ 1 \ n "". Zamiast tego możesz po prostu użyć polecenia „drukuj”.
pożarł elizjum
Nie, nie może, print $1to nie to samo, co print( print $_).
rustyx
Może: echo abc | perl -nw -e "print if (1)"wydrukuje abc. Nie ma potrzeby $1odniesienia.
pożarł elizjum
@devouredelysium: Tak, ale nie chce drukować całej linii, ale tylko liczbę dopasowaną przez wyrażenie regularne.
Ingo Blechschmidt