[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Perl + Strings



Hallo Gerhard,
Gerhard Brauer wrote:
Gruesse!
* Aleks <sektor_1@gmx.net> schrieb am [08.02.07 14:02]:
Und wenn beim nächsten Lauf
/home/mail/foo.bar/nob/spam/test.txt
geparst werden sollte? ;-)

perl_2 # cat test.pl
#!/usr/bin/perl -w

use strict;
my $s = '/home/mail/test.de/bob/spam/test.txt';

sub parse {
       $_[0]=~/($_[1]).*($_[2])/;
       return ($1, $2);
}

my @r = parse($s, "test.de", "bob");
print "domain: $r[0] ; user: $r[1]\n";
perl_2 # ./test.pl
domain: test.de ; user: bob
perl_2 #


voila.


Ich laß das jetzt extra mal zitatmäßig so stehen.
Ich kenn dich ja nicht, evtl. bist du ja auch ein Scherzbold ;-) und
kriegst uns hier alle voll dran...
ich nehm das mal als Kompliment ;-)

i> Durch einfaches übergeben entsprechender Parameter an die Funktion parse, kann nun pro Zeile nach
verschiedenen Daten geparsed werden.
Auch die zu parsende Zeile kann bei jedem Aufruf verändert werden.


Ich erlaube mir mal, dein Skript zu verkürzen:
#!/usr/bin/perl -w
use strict;
print "domain: test.de ; user: bob\n"

Das erfüllt den selben Zweck wie dein Skript und ist kürzer ;-)
*lach* naja, in diesem Fall haben die Scripte tatsächlich dieselbe Ausgabe, aber der Ablauf ist dann doch etwas unterschiedlich.. ;-)

ich habe das ganze mal ein wenig umgebaut, damit vielleicht verständlicher wird, was ich mache:

Nun nehmen wir uns mal mein (obiges) codeschnipsel vor:
1) Interpretor starten
2) Die "Zeile" $s definieren
3) Die Funktion parse() aufrufen und 3 Parameter übergeben:
	$1 = Die zu parsende Zeile, in diesem Fall ein fixen String
	$2 = Der Ausdruck der in die erste Klammer von parse() gesetzt werden soll
	$3 = Dasselbe für die zweite Klammer
4) in parse wird dann auf das erzeugte Pattern geprüft.
5) Die matches der Pattern werden zurückgegeben (return $1,$2).
6) Der Inhalt wird beim beenden von parse() in @r kopiert.
7) Print Anweisung gibt das dann aus..

Jetzt muss man natürlich beachten, dass $s eine fixe Variable ist, die der OP durch irgendeinen variablen "INPUT" ersetzten muss. Auch die Suchausdrücke sollen ja nicht immer dieselben sein. Dann muss der OT die Ausdrücke aber auch irgendwo herbekommen und damit dann eben parse() aufrufen. Und fertig ist es..


Ich habe mal ein kleines, hoffentlich verständlich, Script vorbeireitet, welches das ganze darstellt. Da ich nicht weiß woher der OP seine Daten bekommt (im Endeffekt ist dies auch egal), habe ich einfach mal Dateien als Datenquellen genmommen..

Also, es gibt eine Datei in der der zu untersuchende Input steht:
perl_3 # cat lala
/home/mail/test.de/bob/spam/test.txt
/home/mail/lala.de/bob/spam/test.txt
/home/mail/test.de/aua/spam/test.txt
/export//home/mail/test.de/bob/spam/test.txt
export//home/mail/lulu.de/bob/spam/test.txt
/home/mail/huibuh/alf/spam/test.txt/irgendwas
perl_3 #

Und eine in der die domain/user Daten drinstehen:
perl_3 # cat data
test.de bob
huibuh  alf
perl_3 #

und hier nun das script:
perl_3 # cat test.pl
#!/usr/bin/perl -w

use strict;
my @lines;
my %data;

sub parse {
        $_[0]=~/($_[1]).*($_[2])/;
        return ($1, $2);
}

open IN, "lala";
while (<IN>){
        chomp;
        push @lines, $_;
}
close IN;

open DATA, "data";
while (<DATA>){
        chomp;
        my ($key, $value) = split;
        $data{$key}=$value;
}
close DATA;

for my $line (@lines){
        while (my ($key, $value) = each %data){
                my @r = parse($line, $key, $value);
print "Zeile: $line ; domain: $r[0] ; user: $r[1]\n" if ((define
d $r[0]) && (defined $r[1]));
        }
}
perl_3 #

perl_3 # ./test.pl
Zeile: /home/mail/test.de/bob/spam/test.txt ; domain: test.de ; user: bob
Zeile: /export//home/mail/test.de/bob/spam/test.txt ; domain: test.de ; user: bob Zeile: /home/mail/huibuh/alf/spam/test.txt/irgendwas ; domain: huibuh ; user: alf
perl_3 #

Wenn Du jetzt mal den ganzen kram bis auf parse() weglässt, siehst Du, dass das parse() welches überbleibt, genau dasselbe ist, wie aus meinem vorherigen post. Damit ist dann gezeigt, dass man durch entsprechenden Aufruf von parse() nach verschiedenen domains und user'n Suchen kann.

So, hoffe das war nun besser zu verstehen..

Gruß,
Aleks



Reply to: