Post by Axel ReichertPost by Ulli HorlacherPost by Stefan Reutherund in awk kommt ein `gsub` vor den Suchen+Ersetzen-Regex.
Gibts nur in GNU awk und DER Grund warum ich auf Perl umgestiegen bin.
Du schriebst im Thread weiter oben sinngemaess, dass bash und perl deine
Schweizer Taschenmesser sind. Bei mir sind es bash und gawk. Ich bin
grosser Freund von Universalwerkzeugen. Alle drei Werkzeuge sind
jenseits von POSIX-Minimalismus, also nicht unbedingt als Standard auf
jedem System verfuegbar.
Wenn du dich also sowohl mit der bash als auch mit perl vom
POSIX-Minimalismus entfernst (mache ich ja auch, aber sehe sowohl die
GNU-Software als auch perl als unproblematisch an): Welches sind weitere
Gruende fuer dich, perl statt awk in den Werkzeugkoffer zu stecken?
Wie Stefan schon geschrieben hat: Upgrade-Pfad.
Sowohl awk als auch Perl eignen sich für Einzeiler. Auch für einfache
Mehrzeiler kann man beides verwenden. Aber darüber (insbesondere, wenn
es nicht nur um das Verarbeiten eines einzelnen Text-Streams geht), wird
es bald mühsam. Mein längstes awk-Script (das ich noch finde) hat 173 Zeilen.
Mein komplexestes Perl-Programm, das noch im Einsatz ist, hat hingegen
5152 Zeilen (plus 8990 Zeilen Tests).
Wenn man regelmäßig Programme schreibt, bei denen man mit awk an die
Grenzen stößt und daher ohnehin Perl auch kennen muss, liegt es nahe,
Perl auch für Einzeiler zu verwenden, und awk und sed links liegen zu
lassen.
(Python ist für Einzeiler eher wenig geeignet. Vergleiche:
% awk '{s += $2} END {print s}' foo
26
% perl -n -E '@f = split; $s += $f[1]; END { say $s }' foo
26
% perl -n -a -E '$s += $F[1]; END { say $s }' foo
26
(dafür brauchte ich die Man-Page)
% python3 -c '
import sys
s = 0
for ln in sys.stdin:
f = ln.split()
s += float(f[1])
print(s)
' < foo
26.0
Der Python-Programmierer wird also für die Commandline noch andere
Tools brauchen, z.B. awk)
Post by Axel ReichertMeine Frage ruehrt daher, dass ich in grauer (vielmehr: noch nicht so
grauer) Vorzeit weder sed noch awk konzeptionell verstanden hatte und
der Knoten im Hirn sich erst dann loeste, als ich perl lernte.
Mir ist es mit C so ähnlich gegangen. Pointer in Pascal habe ich nicht
verstanden. Dann habe ich C gelernt, dort verstanden, was Pointer sind,
und konnte sie hinfort auch in Pascal (und Modula, Perl, Java, Python,
...) verwenden (nicht dass ich danach noch viel Pascal programmiert
hätte).
Post by Axel ReichertMir ist klar, dass perl eine Obermenge von awk ist (von daher
universeller, aber auch syntaktisch komplexer und manchmal weniger
konzis), aber welches sind die perl-Features ("g(en)sub" zaehlt nicht),
die du mehr oder weniger staendig nutzt und die den kognitiven
Mehraufwand fuer dich rechtfertigen?
Ungefähr alles, was größere Programme möglich macht. Angefangen bei
lokalen Variablen[1] über Pointer und Klassen bis zu CPAN und einer
Konvention für Test-Suites.
hp
[1] Per Konvention werden in (g)awk lokale Variablen als zusätzliche
Parameter definiert. Die Man-Page nennt das "rather clumsy".
Zugegeben, die »my ($x, $y) = @_«-Konvention für Parameter in Perl
ist auch nicht sehr elegant.