* David Haller wrote on Wed, Dec 21, 2005 at 04:03 +0100: [...]
<btw> In Perl:
perl -ane ' /max_kb_per_request|multcount/ && printf "%20s %10s %s\n", $F[0], $F[1], [split("/", $ARGV)]->[3]; ' /proc/ide/hd?/settings
Schick! Ich sollte z.B. perldoc perlrun doch mal komplett lesen, der Schalter '-a' war mit bisher unbekannt ;)
dann auch "-npi" merken. Superwaffe das Teil.
Ich wuerde allerdings vermutlich '(split(...))[3]' statt '[split(...)]->[3]' verwenden.
Ja, ok. Aber bei so "Schnellschüssen". Ich geb zu, wollte ich erst, ging nicht, vermutlich woanders ein Problem, und fix zu gemacht :)
Naja, ist wohl egal, ob man sich nun ne Referenz auf eine anonyme Liste oder direkt die anonyme Liste nimmt und dann deren 3tes Feld holt...
Wird in beiden Fällen kopiert, glaub ich, aber split(...)[3] funktioniert nicht.
printf "%20s %10s %s\n", $F[0], $F[1], [split(m[/], $ARGV, 0)]->[3] if /max_kb_per_request|multcount/;
Das ist "print wenn match", klar, das gleiche, aber "and" find ich schon nett "match und printe". "and" kann man hier nehmen, aber "&&" ist wohl eh superbekannt und daher lesbar, sonst: /max_kb_per_request|multcount/ and printf "%20s %10s %s\n"; also (err != ok) and die geht dann gut mit or open($f) or die. Find ich Klasse: "Open or die." :-) just BTW.
(Zeilenlaenge von mir gekuerzt), also das "printf ... if .... Witzig finde ich aber, dass beim split das "/" zu 'm[/]' wird, aber das matching beim if nicht zu if 'm/.../'...
Das ist, weil der Regex "/" enthält. Schreibst Du: perl -MO=Deparse -ane ' /max_kb_pe\/\/r_request|multcount/ ' /dev/null kommt wieder m[max_kb_pe//r_request|multcount] split("/") ist ja eigentlich falsch, dann vielleicht besser split(m|[/]|, $ARGV) matcht dann wirklich Zeichenweise, könnte schneller sein, aber sieht schon komisch aus, finde ICH. Geschmackssache :)
So, das mit den Listen/-refs hat mich jetzt doch interessiert:
==== anon-list.pl ==== #!/usr/bin/perl -w use strict; use Benchmark qw(cmpthese); my $res; my $hd = "/proc/ide/hdc/settings"; ### string fuer's split my $iters = 27; ### Anzahl Zeilen in /proc/ide/hdc/settings sub anon_listref { for( 1 .. $iters ) { $res = [split(m[/], $hd)]->[3]; } } sub anon_list { for( 1 .. $iters ) { $res = (split(m[/], $hd))[3]; } } cmpthese( -1, { anon_listref => \&anon_listref, anon_list => \&anon_list } ); ====
$ perl anon-list.pl Rate anon_listref anon_list anon_listref 1793/s -- -33% anon_list 2669/s 49% --
Hey, super, fetzt ja. use Benchmark muss ich mir merken. Wirklich cool, wie schön das geht!
Haette nicht gedacht, dass das so ein Unterschied ist.
Ja, ich auch nicht! Danke für den Test! Interessant, dann kopiert () vielleicht hier doch nicht. Hab mit verschiedenen Strings probiert (lang, viele elemente, mit wenig grossen etc). Der grösste Unterschied ist bei leerem Teststring. Das klingt ja fast so, als ob die Referenzen zusätzlich nennenswert Resourcen brauchen oder split einfach verdammt schnell ist (bzw. bei ein-Zeichen-Regex direkt über strchr oder sowas sucht, das ist bei leerem String hölle schnell. Spannend.
Endlich hab ich mal "intuitiv" die schnellere Version genommen ;)
:-)
(braucht man nicht sed, awk, ... lernen sondern nur Perl - so man es hat)
Och, ich verwende je nach Aufgabe bash, grep, ed, sed, awk oder perl... Ggfs. auch C oder C++. Ruby und Python will ich mir irgendwann mal anschauen.
Ja, klar. Ich hab teils aber alte bash Scripte, wo ich mich heute ärgere, nicht gleich perl genommen zu haben. Die starten teils mehrfach perl oder bc oder expr oder so'n Mist, ist bei 5 zeilen egal, aber wenn man da loopt etc. wirds schnell langsam. Na, was rede ich, siehts Du sicher genauso und wir sind ja einer Meinung: Natürlich verwendet man eine zur Aufgabe passende Sprache. Ich hab gerade bisschen mit Prolog gespielt. Kann man zwar nicht gebrauchen, aber lustig: "Knobeln mit PL" :)
Mein laengstes awk-script ist z.B. $ sed -n '1,/#\{68\}/{/^#/d;p;}' ~/bin/headmidtail | wc -l 162 Zeilen lang (reiner Code, fast ohne Kommentare[1] und den code aus '$prefix/share/awk/getopt.awk'[2]).
Geht das auch mit 80 Zeilen Perl? :-) Nee, wichtig ist IMHO, dass man es noch verstehen kann, sonst schmeisst man es später weg und schreibt es neu. Was OK ist, wenn's was ganz spezielles ist, dass verwendet man eh selten weiter. Aber natürlich kann man auch mit awk schöne, lesbare strukturierte Programme schreiben (man != ich).
Wird ein shell, sed, oder awk-script laenger als eben ca. 100 Zeilen und/oder laeuft es laenger als ca. 10s tendiere ich stark zu perl. Bei kurzen Scripten usw. tendiere ich gegen perl, weil das doch relativ langsam startet, speziell wenn man ein paar (groessere) Module verwendet...
Liegt aber nicht am Perl: link:~ # time perl -e 'exit(0);' real 0m0.004s user 0m0.000s sys 0m0.000s sondern am Modul :) link:~ # time java (fehlermeldung, nix geladen) real 0m0.433s Faktor 100 :-)
Fuer "Kurzkram" der haeufig gestartet wird sind die anderen Programme sinnvoller, d.h. wenn ein grep, sed, awk reicht, dann nehm ich das. BTW: grep kann AFAIK nix, was sed nicht kann und sed kann AFAIK nix, was (g)awk nicht kann. Folgerung: Sobald ein 'sed' auf einer Zeile (Pipe-Kette) auftaucht ist grep ersetzbar, und beide durch 'gawk'. Bsp:
grep 'foo' bar [...] perl -ne 'print if /foo/;' bar
och, wie lang im Vergleich! Schade, kriegt man aber nicht schöner, oder?
dabei darf aber in 'bar' aber keine Zeile mit nur XXX enthalten sein. Das laeuft zwar rein in der bash ist aber trotzdem langsamer als die grep, sed awk und sogar die perl-Variante (zumindest wenn perl schon im Plattencache ist, aber bei der bash kann man da ja auch von ausgehen).
Kommt ja auch immer sehr auf die Daten an. Schätze, grep ist bei grossen Files mit wenig Treffern schnell, perl auch, bash nicht (weil interpreter).
Remember: the value of $/ is a string, not a regex. awk has to be better for something. :-)
d.h. ein 'awk -F "REGEX"' kann man in perl nur (umstaendlich) nachbauen.
Fetzt ja :) Wird awk langsam, wenn man das benutzt? Muss aufwändig sein, weil der regex ja mehr im Speicher braucht (ggf. Anfang bis nächste Zeile). Müsste man mal mit 500 MB file probieren. Ja, in Perl müsste man wohl split nehmen und dazu die gesammten Inputdaten im Speicher haben. Bei 500 MB evtl. schwierig :) Kann awk das?
Mir jedenfalls macht es Spass bash, sed, awk und perl usw. zu kennen / koennen und mir je nach Aufgabe das "Richtige Tool"[tm] herauszusuchen, gemaess dem Motto: "Know thy tools!" und entgegen der (rausgesuchten) sig. Achso: nix gegen perl, ich mag perl sehr, aber es ist nicht immer das richtige Werkzeug. (Deine sig habe ich nicht verstanden)
Da stimme ich Dir vollkommen zu :-) oki, Steffen -- Dieses Schreiben wurde maschinell erstellt, es trägt daher weder Unterschrift noch Siegel.