Thread Regülarer Ausdrück zu einem hash array (19 answers)
Opened by Tom99 at 2008-10-04 15:42

MatthiasW
 2008-10-04 16:52
#115158 #115158
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Hier mal ein - mangels fehlender games.log - ungetestetes Skript, das funktionieren sollte:
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
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my $file = 'C:/Programme/UrbanTerror/q3ut4/games.log';

my %proc = (
        'ClientConnect'  => sub{ print "Client $_[0] connected\n" },
        'ClientBegin'    => sub{ print "Client $_[0] began\n"     },
        'ClientUserinfo' => sub{
                my $line = shift;

                if ( $line =~ /(\d+) \\(.*)/ )
                {
                        print "Client $1: $2\n";

                        my $logline     = $2;
                        my %player_info = $logline =~ m! / ([^/]+) / ([^/]+) !xg;

                        print Dumper \%player_info;
                } # if
        },
);

open( my $fh, '<', $file )
        or die "Cannot open file '$file': $!";

while ( my $line = <$fh> )
{
        chomp($line);

        if ( $line =~ /^\s+(\d{1,2}:\d{2}) ((\w+):(?: )?(.*)?)/ )
        {
                #my $time = $1; # findet keine verwendung

                $proc{$3}->($4) if defined $3 and defined $4;
        } # if
} # while

__END__

Ich hab den Teil mit den ifs rausgenommen und durch einen Hash mit Codereferenzen ersetzt, finde ich eleganter.

use switch brauchst du nicht.
Dafür aber use strict und use warnings ;)
Das -w flag hab ich dann auch mal entfernt.

Das m! ... !xg ist [s]eine[/s] ein Regex.
Sieh dir dazu mal in perlop den Matchoperator an.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'

View full thread Regülarer Ausdrück zu einem hash array