Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7854[/thread]

Parsing einer config-datei



<< >> 8 Einträge, 1 Seite
OnkelBlacky
 2006-04-05 10:20
#64368 #64368
User since
2004-08-20
16 Artikel
BenutzerIn
[default_avatar]
Hallo,

als Neuling in Perl, fällt mir das Parsen von verschiedenen Ausdrücken schwer.

Ich habe eine datei mit z.B: folgenden Inhalt

10.177.178.83;gr-emattig-IP1;Edgar Mattig
10.177.174.71;gr-akaraca-IP1;Adnan Karaca
10.177.165.137 gr-skahlert-IP1 Stefan Kahlert

Ich möchte nun die Werte heraus parsen, die zwischen den beiden Bindestrichen stehen.

Vielen Dank für eure Hilfe
Torsten
bloonix
 2006-04-05 10:37
#64369 #64369
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Guten Morgen Torsten,

Code: (dl )
1
2
3
4
5
6
7
s/^.+;.+-(.+)-.+;.+$/$1/;
# s/// ersetze alles, was im ersten Teil gefunden wird, durch den zweiten
# ^.+; erkennt vom Anfang des Strings bis zum ersten Semikolon (^ = Anfang)
# .+- erkennt bis zum ersten Bindestrich
# (.+)- erkennt bis zum nächsten Bindestrich und speichert es in $1 ab
# .+; erkennt bis zum zweiten Semikolon
# .+$ erkennt den Rest ($ = Ende)


Wiki: Perldoc perlreref

Greez,
opi\n\n

<!--EDIT|opi|1144219541-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2006-04-05 11:16
#64370 #64370
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Da reicht ein einfaches my ($value) = $zeile =~ /-(.*?)-/;


perlretut
perlrequick
perlre

http://www.regenechsen.de
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2006-04-05 12:35
#64371 #64371
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,05.04.2006, 09:16]Da reicht ein einfaches my ($value) = $zeile =~ /-(.*?)-/;[/quote]
Japp, wenn sichergestellt ist, das statt der IP-Adresse nie
ein Hostname erscheinen kann.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Linuxer
 2006-04-05 12:38
#64372 #64372
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
Hi,
wenn sichergestellt ist, dass das Format der Daten so bleibt, reicht ein:
Code (perl): (dl )
1
2
3
# zeilenweises einlesen, zeile steckt in $line
# splitte am '-' und nehme nur das 2. Element
$value = (split(/-/, $line))[1]

Da kann man sich den RegEx sparen.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
esskar
 2006-04-06 02:11
#64373 #64373
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Linuxer,05.04.2006, 10:38]Da kann man sich den RegEx sparen.[/quote]
wenn man sich split anschaut anschaut, könnt man meinen, dass es intern auch RegEx benutzt; vorallem wegen des RegExp pattern, dass du auch verwendet hast :)
Linuxer
 2006-04-06 14:47
#64374 #64374
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
[quote=esskar,06.04.2006, 00:11][quote=Linuxer,05.04.2006, 10:38]Da kann man sich den RegEx sparen.[/quote]
wenn man sich split anschaut anschaut, könnt man meinen, dass es intern auch RegEx benutzt; vorallem wegen des RegExp pattern, dass du auch verwendet hast :)[/quote]
split benutzt Pattern, aber die split-Variante ist trotzdem dem RegEx vorzuziehen, da sie kein aufwendiges Umsetzen von Quantifiern treiben muss und sich auch keine geklammerten Ausdrücke merken muss.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/perl

use strict;
use warnings;
use Benchmark;

use vars qw/$count @data $line/;

$count = 1000000;


@data = (
    '10.177.178.83;gr-emattig-IP1;Edgar Mattig',
    '10.177.174.71;gr-akaraca-IP1;Adnan Karaca',
    '10.177.165.137 gr-skahlert-IP1 Stefan Kahlert',
);

timethese( $count, {
        'regex' => \&ME_regex,
        'split' => \&ME_split,
});

sub ME_regex {
    for $line ( @data ) {
        my ($val) = $line =~ m/-(.*?)-/;
    }
}

sub ME_split {
    for $line ( @data ) {
        my ($val) = (split(/-/, $line))[1];
    }
}

Ergebnis:
Quote
$ perl timeit.pl
Benchmark: timing 1000000 iterations of regex, split...
regex: 35 wallclock secs (34.03 usr + 0.01 sys = 34.04 CPU) @ 29377.20/s (n=1000000)
split: 27 wallclock secs (26.37 usr + 0.00 sys = 26.37 CPU) @ 37921.88/s (n=1000000)
$
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
master
 2006-04-06 15:27
#64375 #64375
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Schreibst du die configfile selber? Oder kommt Sie von wo anders?
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
<< >> 8 Einträge, 1 Seite



View all threads created 2006-04-05 10:20.