Einführung in Perl Kommandozeileneingabe etc - IMS
Einführung in Perl Kommandozeileneingabe etc - IMS
Einführung in Perl Kommandozeileneingabe etc - IMS
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>Perl</strong><br />
Kommandozeilene<strong>in</strong>gabe <strong>etc</strong>.<br />
¤<br />
¤<br />
¤<br />
¤<br />
¤<br />
¤<br />
Kommandozeilene<strong>in</strong>gabe<br />
<strong>in</strong>dex-Funktion<br />
r<strong>in</strong>dex-Funktion<br />
substr-Operator<br />
grep-Operator<br />
map-Operator<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 1<br />
¢ £ ¡<br />
¤<br />
¤<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
Kommandozeilene<strong>in</strong>gabe – Bsp (1)<br />
Zeilen umdrehen<br />
% perl -e ’pr<strong>in</strong>t reverse ;’ date<strong>in</strong>ame.txt<br />
Zeilen mit Zeilennummer ausgeben<br />
% perl -e ’$i=1;while(){pr<strong>in</strong>t "$i: $_";$i++}’ date<strong>in</strong>ame.txt<br />
führenden Whitespace-Zeichen entfernen<br />
% perl -e ’while(){s/^\s+//g;pr<strong>in</strong>t;}’ date<strong>in</strong>ame.txt<br />
Datei <strong>in</strong> Großbuchstaben ausgeben<br />
% perl -e ’while(){pr<strong>in</strong>t uc $_;}’ date<strong>in</strong>ame.txt<br />
(Beispiele von Bernd Schamberger http://www.perlboard.de/perlguide/Kap20.html)<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 3<br />
¢ £ ¡<br />
¤<br />
¤<br />
¤<br />
¤<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
Kommandozeilene<strong>in</strong>gabe<br />
Ausführung von <strong>Perl</strong>-Kommandos direkt von der Kommandozeile,<br />
ohne Programmdatei<br />
siehe perlrun-Manpage<br />
perl -e ’Anweisungen’ # -e executable<br />
bei langen ‘E<strong>in</strong>zeilern’ ggf. Zeilenumbrauch mit ‘<br />
W<strong>in</strong>dows: perl -e "Anweisungen" (ggf. Str<strong>in</strong>gmarkierung<br />
‘"’ schützen<br />
Beispiel:<br />
%perl -e ’pr<strong>in</strong>t "Dies ist e<strong>in</strong> E<strong>in</strong>zeiler\n";’<br />
Dies ist e<strong>in</strong> E<strong>in</strong>zeiler<br />
# Unter W<strong>in</strong>dows:<br />
C:\> perl -e "pr<strong>in</strong>t \"Dies ist e<strong>in</strong> E<strong>in</strong>zeiler unter W<strong>in</strong>dows\n\";"<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 2<br />
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
Kommandozeilene<strong>in</strong>gabe – Optionen<br />
-e ausführbar<br />
-w gibt Warnungen aus<br />
-n erzeugt while-Schleife um Programm<br />
-p wie -n mit zusätzlicher pr<strong>in</strong>t $ Funktion <strong>in</strong> Schleifenblock<br />
-l entfernt<br />
¥ n vorübergehend<br />
-i bearbeitet Dateien, die durch e<strong>in</strong>gelesen werden,<br />
wenn Extension gegeben, erzeugt es Backup-Datei<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 4<br />
¦<br />
§<br />
¥ ’
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
Kommandozeilene<strong>in</strong>gabe – Bsp (2)<br />
% perl -p -e ’$_ = uc $_;’ test.txt<br />
Vergleiche<br />
while () {<br />
$_ = uc $_;<br />
pr<strong>in</strong>t;<br />
}<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 5<br />
¢ £ ¡<br />
¤<br />
¤<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
<strong>in</strong>dex-Funktion (1)<br />
f<strong>in</strong>det erstes Match von Substr<strong>in</strong>g<br />
gibt nullbasierten Integer-Wert zurück für Position des 1.<br />
Buchstabens des Substr<strong>in</strong>gs<br />
wenn ke<strong>in</strong> Match gefunden wird: -1<br />
Syntax:<br />
$wo = <strong>in</strong>dex($grosser str<strong>in</strong>g, $substr<strong>in</strong>g);<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 7<br />
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
Noch e<strong>in</strong> Beispiel<br />
%$ perl -p -i.bak -w -e ’s/Randall/Randal/g’ fred*.dat<br />
Vergleiche<br />
# /usr/b<strong>in</strong>/perl -w<br />
@ARGV = glob "fred*.dat";<br />
while () {<br />
s/Randall/Randal/g;<br />
pr<strong>in</strong>t;<br />
}<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 6<br />
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
<strong>in</strong>dex-Funktion - Beispiel<br />
$wo = <strong>in</strong>dex ("Abrakadabra", "abra");<br />
pr<strong>in</strong>t "$wo\n";<br />
:> # A b r a k a d a b r a<br />
:> # 0 1 2 3 4 5 6 - - - -<br />
$wo = <strong>in</strong>dex ("abrakadabra", "arba"); # Tippfehler bei ’arba’<br />
pr<strong>in</strong>t "$wo\n";<br />
:>-1<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 8
¢ £ ¡<br />
¤<br />
¤<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
<strong>in</strong>dex-Funktion (2)<br />
optionaler 3. Parameter: Suchbeg<strong>in</strong>n<br />
Syntax:<br />
$wo = <strong>in</strong>dex($grosser str<strong>in</strong>g, $substr<strong>in</strong>g, Suchbeg<strong>in</strong>n);<br />
Default für Suchbeg<strong>in</strong>n = 0<br />
meist <strong>in</strong> Schleife e<strong>in</strong>gebaut<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 9<br />
¢ £ ¡<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
r<strong>in</strong>dex-Funktion<br />
f<strong>in</strong>det das letzte Vorkommnis e<strong>in</strong>es Suchstr<strong>in</strong>gs<br />
Syntax:<br />
$wo = r<strong>in</strong>dex($grosser str<strong>in</strong>g, $substr<strong>in</strong>g, Suchbeg<strong>in</strong>n);<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 11<br />
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
$wo =0;<br />
$n = 0;<br />
<strong>in</strong>dex-Funktion (2) - Bsp<br />
while ($wo !~ -1){<br />
$wo = <strong>in</strong>dex ("abrakadabra", "ab", $wo+$n);<br />
pr<strong>in</strong>t "$wo\n" ;<br />
$n=1;<br />
}<br />
:>0 # a b r a k a d a b r a<br />
- -<br />
:>7 # a b r a k a d a b r a<br />
- -<br />
:>-1 # nicht (mehr) gefunden<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 10<br />
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
r<strong>in</strong>dex-Funktion Beispiel<br />
$wo = length "abrakadabra";<br />
$n = 0;<br />
while ($wo !~ -1){<br />
$wo = r<strong>in</strong>dex ("abrakadabra", "ab", $wo-$n);<br />
pr<strong>in</strong>t "$wo\n" ;<br />
$n=1;<br />
}<br />
:>7 # a b r a k a d a b r a<br />
--<br />
:>0 # a b r a k a d a b r a<br />
- -<br />
:>-1 # nicht (mehr) gefunden<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 12
¢ £ ¡<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
substr-Operator (1)<br />
ermittelt Teil (= Substr<strong>in</strong>g) e<strong>in</strong>es größeren Str<strong>in</strong>gs<br />
zwei Argumente (+ zwei optionale Argumente)<br />
– Str<strong>in</strong>g<br />
– Startposition<br />
positive Zahl<br />
gezählt<br />
negative Zahl<br />
gezählt<br />
– Länge (optional)<br />
– Ersetzung<br />
¡<br />
Zeichenposition vom Anfang des Str<strong>in</strong>gs<br />
¡<br />
Zeichenposition vom Ende des Str<strong>in</strong>gs<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 13<br />
¢ £ ¡<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
substr-Operator (2)<br />
Verknüpfung von substr und <strong>in</strong>dex<br />
$langer_str<strong>in</strong>g = "Fred J. Feuerste<strong>in</strong>";<br />
$teil = substr ($langer_str<strong>in</strong>g, <strong>in</strong>dex ($langer_str<strong>in</strong>g, "s"));<br />
# ergibt "ste<strong>in</strong>"<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 15<br />
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
substr-Operator (1) – Bsp<br />
$teil = substr ("Fred J. Feuerste<strong>in</strong>", 8, 5); # ergibt "Feuer"<br />
$teil = substr ("Fred J. Feuerste<strong>in</strong>", 13, 1000); # ergibt "ste<strong>in</strong>"<br />
$teil = substr ("Fred J. Feuerste<strong>in</strong>", 13); # ergibt "ste<strong>in</strong>"<br />
$teil = substr ("Fred J. Feuerste<strong>in</strong>", -3); # ergibt "e<strong>in</strong>"<br />
$teil = substr ("Fred J. Feuerste<strong>in</strong>", -3, 2); # ergibt "ei"<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 14<br />
¢ £ ¡<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
substr-Operator (3)<br />
ausgewählter Teil kann verändert werden<br />
muss dazu <strong>in</strong> Variable stehen<br />
$str<strong>in</strong>g = "Fred J. Feuerste<strong>in</strong>";<br />
substr ($str<strong>in</strong>g, 0, 7) = "Wilma"; # ersetzt<br />
# Fred J.<br />
# 0123456<br />
# durch<br />
# Wilma<br />
pr<strong>in</strong>t "$str<strong>in</strong>g\n"; # ergibt:<br />
# :>Wilma Feuerste<strong>in</strong><br />
Oder:<br />
$geloeschter_str<strong>in</strong>g = substr ($str<strong>in</strong>g, 0, 7,"Wilma"); # Fred J.<br />
pr<strong>in</strong>t "$str<strong>in</strong>g\n"; # Wilma Feuerste<strong>in</strong><br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 16
¢ £ ¡<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
substr-Operator (4)<br />
mittels B<strong>in</strong>dungsoperator = Operation auf Teilstr<strong>in</strong>g beschränken<br />
$str<strong>in</strong>g = "Fred J. Feuerste<strong>in</strong>";<br />
substr ($str<strong>in</strong>g, -10) =~ s/e/E/g;<br />
pr<strong>in</strong>t "$str<strong>in</strong>g\n"; # ergibt<br />
# :>Fred J. FEuErstE<strong>in</strong><br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 17<br />
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
my @ungerade_zahlen;<br />
foreach (1..1000) {<br />
if ($_ % 2) {<br />
push (@ungerade_zahlen, $_)<br />
}<br />
}<br />
¤<br />
dasselbe mit grep:<br />
grep-Operator (2)<br />
my @ungerade_zahlen = grep { $_ % 2} (1..1000);<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 19<br />
¢ £ ¡<br />
¤<br />
¤<br />
¤<br />
¤<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
grep-Operator (1)<br />
filtert Elemente aus e<strong>in</strong>er Liste<br />
Syntax: Operator – Block mit $ – Liste<br />
für jedes Listenelement wird Block 1x ausgewertet<br />
vgl. Unix-Hilfsprogramm grep<br />
Beispiel: E<strong>in</strong>lesen von ungeraden Zahlen <strong>in</strong> Array<br />
konventionell:<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 18<br />
¢ £ ¡<br />
¤<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
grep-Operator (3)<br />
zeilenweises E<strong>in</strong>lesen aus Datei<br />
hier: groß- und kle<strong>in</strong>schreibungsunabhängige Suche nach dem<br />
Wort <strong>Perl</strong><br />
liest Zeilen mit Match <strong>in</strong> Array zeilen suche e<strong>in</strong> (Mit<br />
Newl<strong>in</strong>ezeichen)<br />
open (FILE, "test.txt") or die "$!";<br />
my @zeilen_suche = grep { /\bperl\b/i } ;<br />
¤<br />
wenn Filter e<strong>in</strong>facher Ausdruck, weitere Vere<strong>in</strong>fachung<br />
my @zeilen_suche = grep /\bperl\b/i, ;<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 20
¢ £ ¡<br />
¤<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
map-Operator (1)<br />
wandelt Elemente aus e<strong>in</strong>er Liste um<br />
analoge Syntax zu grep: Operator – Block mit $ – Liste<br />
Beispiel: Lösche Muster<br />
¥ <strong>in</strong>dex{p}{Chomsky}<br />
¥ <strong>in</strong>dex{l}{German}<br />
¥ <strong>in</strong>dex<br />
¥ {[pl]<br />
¥ }<br />
¥ {[<br />
¥ }]*<br />
¥ }<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 21<br />
¢ £ ¡<br />
¤<br />
¤<br />
¤<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
grep versus map (1)<br />
grep gibt Wert von $ zurück, wenn Block wahr ist<br />
map ersetzt $ mit letztem Ausdruck aus Block<br />
Beispiele<br />
@ungerade_zahlen = grep {"Tautologie"} (1..5);<br />
foreach $x (@ungerade_zahlen){<br />
pr<strong>in</strong>t "$x\n";<br />
}<br />
:>1<br />
:>2<br />
:>3<br />
:>4<br />
:>5<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 23<br />
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
open (FILE, "test.txt") or die "$!";<br />
map-Operator (2)<br />
map { pr<strong>in</strong>tf "%s\n", &delete_multi_<strong>in</strong>dex($_) } ;<br />
sub delete_multi_<strong>in</strong>dex {<br />
chomp( my $v = $_[0]);<br />
}<br />
¤<br />
$v =~ s/\\<strong>in</strong>dex\{[pl]\}\{[^\}]*\}//g;<br />
return $v ;<br />
alternativ (und kürzer):<br />
E<strong>in</strong>schub: Zeilene<strong>in</strong>gabe<br />
:> perl -l -p -e ’s/\\<strong>in</strong>dex\{[pl]\}\{[^\}]*}//g’ test.txt<br />
:><br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 22<br />
¢ £ ¡<br />
<strong>IMS</strong> Heike Z<strong>in</strong>smeister<br />
grep versus map (2)<br />
@ungerade_zahlen = map {"Tautologie"} (1..5);<br />
foreach $x (@ungerade_zahlen){<br />
pr<strong>in</strong>t "$x\n";<br />
}<br />
:>Tautologie<br />
:>Tautologie<br />
:>Tautologie<br />
:>Tautologie<br />
:>Tautologie<br />
<strong>Perl</strong>, 19.12.03 Kommandozeilene<strong>in</strong>gabe 24