On 2023-11-04 09:46, Axel Reichert <
ma...@axel-reichert.de> wrote:
> Ulli Horlacher <
fram...@rus.uni-stuttgart.de> writes:
>> Stefan Reuther <
stefa...@arcor.de> wrote:
>>> und 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)
> Meine 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).
> Mir 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.