Thread Regex: String aufteilen, Substrings in variablen schreiben (1 answers)
Opened by radon at 2010-11-09 19:03

radon
 2010-11-09 19:03
#142597 #142597
User since
2010-11-09
1 Artikel
BenutzerIn
[default_avatar]
Hallo!

Ich bin Anfänger in perl, kenne mich aber gut in diversen anderen sprachen aus und beherrsche regex "ausreichend".

Ausgangssituation:

Ich schreibe an einem plugin für einen konsolengesteuerten unix-irc clienten. Das geht (leider) nur mit perl :P

Ich bekomme also einen String mit Infos über die Person die mir per irc eine nachricht schreibt und den String der Nachricht.
Dieser soll nun nach bestimmten Matches untersucht werden und wenn er die Form des Strings hat den ich suche, möchte ich div. Infos aus dem String extrahieren und dann weiter damit vorgehen.

Mein Problem:

Den String den ich bekomme kann ich korrekt erkennen, dass er die gewünschte Form hat. Das funktioniert soweit. Allerdings hänge ich beim Extrahieren der Substrings.
Laut vielen Guides im Netz reicht es, $string =~ "m/hierregex/"; auszuführen und schon werden mir die matches der gruppierten regex ausdrücke, wie z.b. (.+) oder (.*) in die Variablen $1, $2, usw. gespeichert.
Das scheint bei mir jedoch nicht zu funktionieren, die $1, $2, ..., $8 bleiben leer.

Der Code:

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
44
45
46
47
48
49
50
51
52
use Irssi;
use Irssi::Irc;
use strict;
use vars qw($VERSION %IRSSI);

$VERSION="0.3";
%IRSSI = (
        authors=> '...',
        name=> '...',
        description=> 'Auto download script',
        license=> 'GPL',
);

# Auto download script for SCC

# [...]

my $url = "http://someurl.tld/download.php?id=";
my $botnick = "dl-bot";
my $bottarget = "username";
my $botadd = "1337\@bot.someurl.tld";

sub event_privmsg {
 my ($server, $data, $nick, $address) = @_;
 my ($target, $text) = split(/ :/, $data, 2);
 $text =~ s/\x03\d?\d?(,\d?\d?)?|\x02|\x1f|\x16|\x06|\x07//g;


# download matching
if (($address =~ /$botadd/) && ($nick =~ /$botnick/) && ($text =~ m/\^C9,1[a-zA-Z0-9\-_ ]+ \^C11\- \^C9,1Uploaded: || (.*) \^C11\- \^C0http:\/\/someurl.tld\/download.php?id=(.*) \^C11\-OR\-\^C0 http:\/\/someurl.tld\/download.php?action=download&id=[0-9]+/)) 
{

    my $sstring = $text;
    $sstring =~ m/^\^C9,1.+ \^C11\- \^C9,1Uploaded: \|\| (.+) \^C11\- \^C0?7(.+) \^C11\[\^C9,1\-(.+)\-\^C11\] \- \^C11\(\^C9,1(.+)\) \^C11\- \^C0http:\/\/someurl\.tld\/download\.php\?id=(.+) \^C11\-OR\-\^C0 http:\/\/someurl\.tld\/download\.php\?action=download&id=(.+)$/i;

    my $scat = $1;
    my $stitle = $2;
    my $syear = $3;
    my $sinfo = $4;
    my $sid = $5;
    my $sid2 = $6;    

    system qq{echo "sanitized string: $sstring" >> ~/pl_debug.log 2>&1};
    Irssi::print("TEST: $scat, $stitle");

#    system qq{wget -O "$somedir/$srel.zip" "$url" > /dev/null 2>&1};
}

system qq{echo "$server: [$data] :: $nick / $address" >> ~/pl_debug.log 2>&1};
}

Irssi::signal_add("event privmsg", "event_privmsg")


Etwas abgekürzt...

Das Problem findet nun in diesen Zeilen statt:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
    my $sstring = $text;
    $sstring =~ m/^\^C9,1.+ \^C11\- \^C9,1Uploaded: \|\| (.+) \^C11\- \^C0?7(.+) \^C11\[\^C9,1\-(.+)\-\^C11\] \- \^C11\(\^C9,1(.+)\) \^C11\- \^C0http:\/\/someurl\.tld\/download\.php\?id=(.+) \^C11\-OR\-\^C0 http:\/\/someurl\.tld\/download\.php\?action=download&id=(.+)$/i;

    my $scat = $1;
    my $stitle = $2;
    my $syear = $3;
    my $sinfo = $4;
    my $sid = $5;
    my $sid2 = $6;    

    system qq{echo "sanitized string: $sstring" >> ~/pl_debug.log 2>&1};
    Irssi::print("TEST: $scat, $stitle");


Trotz =~ Verknüpfung und mehreren regex gruppen bleiben die $1,...$6 leer.
d.h. Ich bekomme als Ausgabe: "TEST: ,".
Wo liegt da der fehler? Ist das regex falsch?

Im ersten Zug müssen aus der IRC Nachricht noch die Colorcodes rausgefiltert werden, die haben die Form ^C11, ^C9,1, ^C0, usw. nachdem das passiert ist habe ich dann in etwa einen String wie:

"Tux - Uploaded: || Ubuntu - Ubuntu 10.10 server November [-2010-] - (Multi, Region-Free, Image) - http://someurl.tld/download.php?id=123 -OR- http://someurl.tld?action=download&id=123"

Mit Tux als dem Nutzer des Uploads, "Ubuntu" als Kategorie, "Ubuntu 10.10 server November" als titel, 2010 als Jahr, Zusatzinfo in der Klammer danach und die Downloadurl mit der FileID als Parameter.

Diese fett gedruckten daten muss ich also Extrahieren und in perl als variablen bekommen.
Warum funktioniert das bei mir nicht und wie bekomme ich das am besten hin?


Gruß -r
Last edited: 2010-11-09 19:25:24 +0100 (CET)

View full thread Regex: String aufteilen, Substrings in variablen schreiben