Lubię myśleć o perl -n
jak wybieranie konkretnych bitów wejściowych i perl -p
jak map
dla wszystkich liniach wejście.
Jak już zauważył, że to możliwe, aby uzyskać efekt -p
z -n
i możemy emulować na odwrót:
$ echo -e "1\n2\n3" | perl -pe '$_="" if $_ % 2 == 0'
1
3
Pomijanie linii z next
wydaje się bardziej naturalne, ale kod -p
okłady w
LINE:
while (<>) {
... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
Zgodnie z projektem, next
biegnie continue
bloków:
Jeśli istnieje blok continue
, jest on zawsze wykonywany tuż przed ponownym oceną warunku. Dzięki temu można go użyć do zwiększenia zmiennej pętli, nawet jeśli pętla została kontynuowana za pomocą instrukcji .
Przełącznik -l
posiada dwa poręczne efekty:
- Z
-n
i -p
automatycznie chomp
każdy rekord wejściowy.
- Ustaw
$\
, więc każdy print
niejawnie dodaje terminator.
Na przykład, aby pobrać pierwsze 10 porty UDP wymienione w /etc/services
to polubisz
perl -ane 'print $F[1] if $F[1] =~ /udp/' /etc/services | head
ale oops:
7/udp9/udp11/udp13/udp17/udp19/udp37/udp39/udp42/ud...
Lepiej:
$ perl -lane 'print $F[1] if $F[1] =~ /udp/' /etc/services | head
7/udp
9/udp
11/udp
13/udp
17/udp
19/udp
37/udp
39/udp
42/udp
53/udp
Pamiętaj, że -n
i -p
może być w linii shebang też tak, aby zapisać powyższy oneliner jako skrypt:
#! /usr/bin/perl -lan
BEGIN {
@ARGV = ("/etc/services") unless @ARGV;
open STDOUT, "|-", "head" or die "$0: head failed";
}
print $F[1] if $F[1] =~ /udp/
'perl -pe' jest odpowiedni dla przykładowego kodu. Użyj '-pe' i upuść' print' oświadczenie – mob
Gee, dowiedziałem się o tym czytając wynik polecenia 'perl --help'. Zwykle używam tej opcji we wszystkich programach, z których korzystam, aby wiedzieć, co jest dostępne. –
Cóż, naprawdę wszystko w Perlrun. Każdy haker Perla powinien przeczytać dokumentację. :) –