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

Mehrere reguläre Ausdrücke finden



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Stephan
 2005-02-28 17:22
#52170 #52170
User since
2005-01-12
2 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich habe gesucht, aber offenbar große Tomaten auf den Augen und würde mich über Hilfe freuen.

Ich habe einen langen Text aus einer XML-Datei (ist eigentlich egal), den ich in eine Variable geschrieben habe:

@Zeilen = <DATEIINHALT>;
$line = join('', @Zeilen);


Daraus suche ich mir ein Tag mit einem Wert heraus und speichere is in einer Variablen $gefunden:
my ($tag) = $line =~ /<OrderPosAd(.*?)>/;
my ($merkmal) = $tag =~ / Datum=\"(.*?)\"/;
$gefunden = $merkmal;


Soweit funktioniert alles. Was aber mache ich damit ich den NÄCHSTEN Tag mit diesen Kriterien finde???
Momentan erhalte ich immer nur der ersten Wert.

Anders gefragt: Wie kann ich mit Hilfe regulärer Ausdrücke nicht nur den ersten zutreffenden Wert, sondern alle finden???
(Abfragen müßte ja mit $1,$2, usw. gehen - aber ich kriege immer nur den ersten gefundenen Wert) :-(

Danke falls jemand eine Tip hat!
Gast Gast
 2005-02-28 17:26
#52171 #52171
Normalerweise:
Code: (dl )
while( /<(.+?)>/g ) ..

Aber ich denke, du solltest eher CPAN nach XML-Parsern durchsuchen.\n\n

<!--EDIT|phaylon|1109604383-->
Crian
 2005-02-28 17:44
#52172 #52172
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
my @gefunden;
while (my ($tag) = $line =~ /<OrderPosAd(.*?)>/g) {
my ($merkmal) = $tag =~ / Datum=\"(.*?)\"/;
push @gefunden, $merkmal;
}



btw., statt

Code: (dl )
1
2
@Zeilen = <DATEIINHALT>;
$line = join('', @Zeilen);


benutz doch

Code: (dl )
my $line; {local $/; $line = <DATEIHANDLE>; }


oder File::Slurp.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2005-02-28 18:17
#52173 #52173
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ähm, bin ich blind oder erzeugt der code ne endlos while-schleife. $line ändert sich doch nicht und wird deswegen immer neu gematched.
folgendes ist gestestet und funktioniert, hat aber eher beispielcharaker:
Code: (dl )
1
2
3
4
5
6
7
8
use strict;
use warnings;

my $foo = "just another string";
for my $bar ( $foo =~ /(.)/g ) {
print $bar, "-";
}
print "\n";
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2005-02-28 18:44
#52174 #52174
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
ja stimmt, dann so

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!usr/bin/perl
use strict;
use warnings;

local $_ = <<ENDE;
<OrderPosAd Datum="2005-02-28" Bla="blubb">hjgadf</OrderPosAd>
<Suppe>Grünkern</Suppe>
<OrderPosAd Datum="2005-02-27" Bla="blubber">hjishfgadf</OrderPosAd>
<Fleisch>Putenbrust</Fleisch>
<OrderPosAd Datum="2005-02-26" Bla="blasenwerf">hjoejwhishfgadf</OrderPosAd>
ENDE

my @gefunden;

while (s~<OrderPosAd([^<>]*)>[^<>]+</OrderPosAd>~~) {
my $tag = $1;
my ($merkmal) = $tag =~ / Datum=\"(.*?)\"/;
push @gefunden, $merkmal;
}

print "@gefunden";


Ausgabe

Code: (dl )
2005-02-28 2005-02-27 2005-02-26
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2005-02-28 18:54
#52175 #52175
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Taulmarill,28.02.2005, 17:17]ähm, bin ich blind oder erzeugt der code ne endlos while-schleife.[/quote]
perldoc perlop:
              In scalar context, each execution of "m//g" finds
              the next match, returning true if it matches, and
              false if there is no further match.  


edit: ach, du meintest crians code...\n\n

<!--EDIT|pq|1109621930-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2005-02-28 19:21
#52176 #52176
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Crian,28.02.2005, 17:44]ja stimmt, dann so[/quote]
wieso denn?
edit:
anstatt while (my ($tag) = $line =~ /<OrderPosAd(.*?)>/g) {

while ($line =~ /<OrderPosAd(.*?)>/g) {
 my $tag = $1;
\n\n

<!--EDIT|pq|1109622294-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2005-03-01 01:15
#52177 #52177
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Wieso macht das denn den Unterschied aus? Ich war vorhin schon ganz verwundert, weil ich meinte schon solche Konstrukte verwendet zu haben...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2005-03-01 13:16
#52178 #52178
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
skalarer vs. listenkontext.
while (my ($tag) = ...) ist listenkontext.
while(...) ist skalarer kontext.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2005-03-01 13:35
#52179 #52179
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Ah ja, jetzt wo Du das sagst ist es ganz logisch =)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-02-28 17:22.