Schrift
[thread]6034[/thread]

Pattern matching: zahlen aus einem String herauslesen

Leser: 1


<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten
monetron
 2004-01-23 16:13
#79449 #79449
User since
2003-10-23
15 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo Leute !
Mein Problem: In einer Liste @liste habe ich 1300 strings
die so aussehen: $liste[233]="-- 23 ----------------------"
Diese Zahl kann 1,2 oder mehrstellig sein und beginnt immer an 4 Stelle im String.
Nun möchte ich sie in eine schleife  auslesen und damit arbeiten.
ungefähr so:  
$liste[$zaehler]=~/^-- \d/;$ergebniss[$zaehler]=$1;
kann mir jemand bei dem PatternMatsch helfen?
Vielen Dank an Euch PerlSuperHirne !!
eisbeer
 2004-01-23 16:36
#79450 #79450
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
my @strings = ( ...);

for my $digit (@strings) {
$digit =~ s/^--\s(\d+)\s-*$/$1/;
# do sth with $digit
}


Ungetestet.
Gehe bei der Regex jetzt davon aus, das der
String aus 2 führenden Bindestrichen, gefolgt
von einem Leerzeichen, 1 bis n Zahlen, wieder
einem Leerzeichen und danach von beliebig vielen
Bindestrichen zusammengesetzt ist.
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
monetron
 2004-01-23 17:27
#79451 #79451
User since
2003-10-23
15 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo EISBAER !

der String sieht in Wirklichkeit so aus !
"-- 23 ----------------------------------- 868689"
An Ende befindet sich noch eine beliebig grosse
Zeilennummer aus dem Logfile. Ich habe versucht
Deinen Tip umzusetzen, aber es FUNZT noch net:

$diff=23;
$line='empty';
until ($match eq $diff){
$line=pop @errlist;

$line=~s/^--\s(\d+)\s-*$\s(\d+)/$match/;

unshift @difflist,$line;
}

Sprich hole alles aus @errlist von hinten raus und schreibe es in @difflist bis der String $diff matched.
DS
 2004-01-23 17:54
#79452 #79452
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
Hm, du hast scheinbar noch ein Verständnis-Problem bezüglich der Suchen-und-Ersetzen-Funktion mit regulären Ausdrücken (s///). Das zwischen den beiden ersten Schrägstrichen is der reguläre Ausdruck, mit dem der Ausdruck "gematched" werden soll, das hast du richtig gemacht, aber das zwischen den anderen ist das, mit dem das Gefundene dann ersetzt werden soll. In denem Fall soll nicht's ersetzt werden, sondern etwas gefunden werden, d.h. du brauchst kein s///, sondern ein m//, oder schlichtweg ein //.

Das Ganze konkret an deinem Beispiel:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
my @errlist = (...);
my @difflist;
my $diff = 23;
my $match;
do {
  my $line = pop @errlist || last;
  $match = ($line =~ /^-- (\d+)/);
  unshift @difflist, $line;
} until $match == $diff;


Und noch a bisserl was formelles: ;)
1. Bitte einrücken!
2. Bitte mit [ code ] [ /code ] oder [ perl ] [ /perl ] (jeweils ohne Leerzeichen) Perl-Code als solchen markieren...\n\n

<!--EDIT|DS|1074873379-->
monetron
 2004-01-23 18:08
#79453 #79453
User since
2003-10-23
15 Artikel
BenutzerIn
[Homepage] [default_avatar]
>DS
damit komme ich die Meldung

Can't "last" outside a loop block at checklog.pl line 47.
DS
 2004-01-23 18:28
#79454 #79454
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
[quote=monetron,23.01.2004, 17:08]>DS
damit komme ich die Meldung

Can't "last" outside a loop block at checklog.pl line 47.[/quote]
Ups... das kommt davon wenn man's nicht testet... ;)

Ich wußte gar ned, dass man bei nachgestelltem until/while nicht lasten kann... naja... wieder was gelernt...

Zieh das until einfach vor...

Code (perl): (dl )
until ($match == $diff) { ... }


Wenn $diff auch 0 sein kann, dann einfach $match mit -1 oder initialisieren...

Ich hoffe es sind sonst keine Fehler mehr drin... ;)
renee
 2004-01-23 18:36
#79455 #79455
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
my @liste = (...); # halt deine Zeichenketten
my @array = ();
foreach my $string(@liste){
my (@zahlen) = $string =~ /(\d+)/g;
push(@array,@zahlen);
}

print $_,"\n" for(@array); # gibt jetzt alle gefundenen Zahlen aus...
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/
eisbeer
 2004-01-23 18:47
#79456 #79456
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
suspekt, ich wusste garnet, das man aus
do-schleifen net last-en kann
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
DS
 2004-01-23 19:56
#79457 #79457
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
[quote=eisbeer,23.01.2004, 17:47]suspekt, ich wusste garnet, das man aus
do-schleifen net last-en kann[/quote]
Was meinst du mit do-Schleife? Ein do allein macht ja noch keine Schleife also ist do { last }; => Fehler, obwohl ich das ab und zu recht lästig finde...

do { } while (); wäre eine, aber vermutlich fasst er das wie &machwas while (); sub machwas { do {} } auf... naja... nicht wirklich so ;) ... aber getrennt halt, deswegen kein last...

Ich sollte aufhören zu reden/schreiben...

Nachtrag: So kann's nicht stimmen, denn dann müßte do { print 1 } until 1; das selbe machen wie print 1 until 1;, was natürlich nicht so ist, dann genau dazu is ja die Konstruktion do { } while/until (); da... komisch das...\n\n

<!--EDIT|DS|1074881151-->
eisbeer
 2004-01-23 20:13
#79458 #79458
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ja do alleine ist natürlich keine schleife, ich
habe blos nicht do-while oder do-until geschrieben,
weil ich dachte, es wäre klar :)

Stimme mit deiner "Vermutung" überei :)
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten



View all threads created 2004-01-23 16:13.