Thread grep-Aufruf aus Perlscript funktioniert nicht (8 answers)
Opened by Superfrank at 2008-05-21 14:00

sid burn
 2008-05-23 19:06
#110191 #110191
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Gast+2008-05-21 19:03:19--
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
!# /usr/bin/perl
use strict;
use warnings;

my $file='/etc/mail/access';

open(my $in, '<', $file) or die "konnte $file nicht oeffnen ($!)\n";
my @got=grep{$_=~/ClientConn:\s+5/}(<$in>);
close ($in);

if(@got>0)
{
 # was gefunden
}
else
{
 # nichts gefunden
}


Tippdauer: ~2Min

Und wieviel Zeit hast du jetzt hier im Forum verschwendet weil du nicht beachtet hast das die Regex die du in System/qx angibst Doppelt Quoten musst?

Bis zu deiner Fragestellung und die erste Antwort sind 3 Min vergangen. Eine Antwort mit einer konkreten Lösung ist nach 5 Min gekommen. Und du hast nach 12 Min gepostet. Der Zeitaufwand dafür war ja jetzt wohl deutlich höher. Und die Frage ist wie lange hast du davor schon gegrübelt woran das lag inklusive Post schreiben? Wahrscheinlich lag der Zeitaufwand jetzt bei ~30Min.

Und bei soviel Zeitaufwand musst du jetzt:
1) die Regexe Quoten
2) Das Programm ist nicht mehr Platformunabhängig
3) Subshell starten ist langsamer
4) Das ganze kann auch Fehleranfälliger sein (konjuktiv)
5) Du musst die ergebnisse erstmal nochmal Splitten wenn du das selbe ergebnisse heraus bekommen möchtest wie das eingebaute grep.
6) Nicht jedes grep unterstützt den Schalter "-P" du kannst nichtmal sicher sein das dies Funktioniert.
7) Das Programm funktioniert mit dem Schalter -T nicht mehr
8) Dein Programm arbeitet einfach weiter selbst wenn die Datei mit dem Systemaufruf von grep nichts gefunden hat, oder die Datei aus rechte Problemen etc. nicht geöffnet werden konnte.

Die Vorteile bei einem qx/system() aufruf erschlagen mich ja regelrecht...

Ansonsten wenn es eine Datei ist die mehrere solche beziehungen hat dann kannst du das viel elegenater so lösen:

ungetestet:
Code: (dl )
my %config = map { m/ \A (.*?) : \s+ (.*) /xms } <$file>


Und danach kannst du folgendermaßen drauf zugreifen:

Code: (dl )
1
2
print $config{ClientConn}, "\n";
print $config{ClientIrgendwas}, "\n";


Das ganze kannst du dann auch in eine Subroutine packen der du nur einen Filenamen übergibst und es dir die Datenstruktur zurück liefert. Und das finde ich deutlich besser.

Der "Aufwand" lohnt sich schon sobald du zwei Dinge auslesen möchtest. Dann must du nicht für jeden Parameter ein grep starten und jedesmal die Datei neu durchgehen.

Und hättest du es sofort den Perl Weg gemacht wäre es sauberer du hättest die Probleme nicht und letztendlich hättest du sogar mehr Zeit gespart.

Quick & Dirty gibt es nicht und lohnt sich auch nicht. ;)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread grep-Aufruf aus Perlscript funktioniert nicht