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

Reguläre Ausdrücke durch anderes ersetzten... (Seite 4)

Leser: 2


<< |< 1 2 3 4 5 6 >| >> 60 Einträge, 6 Seiten
Strat
 2004-02-18 17:35
#80132 #80132
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
grundsaetzlich sieht ein regulaerer Ausdruck folgendermaszen aus:

$string =~ m/pattern/

wenn die Trennzeichen / sind, kann man das m auch weglassen

$string =~ /pattern/

das wird sehr haeufig gemacht. wenn jedoch ein anderes Trennzeichen verwendet wird (z.B. weil / sehr haeufig in pattern vorkommt und man nicht jedesmal \/ schreiben will, muss man das m schreiben:

$string =~ m|pattern|
oder
$string =~ m(pattern);
aber auch:
$string =~ m)pattern);

man kann sogar buchstaben oder zahlen als trennzeichen verwenden, wenn man nach dem m ein leerzeichen macht
$string =~ m xpatternx

Zu den Ankern ^ und $: wenn man in einem Ausdruck die Position des Vorkommens zum Anfang oder Ende hin festlegen kann, braucht die Regex-Engine nicht so viel suchen und man bekommt somit das Ergebnis schneller

$string =~ /^abcd$/i findet aBcD, aber auch abdc, nicht hingegen abcde oder bcab

siehe auch das Kapitel ueber die Regulaeren Ausdruecke auf http://www.fabiani.net/ -> Vortraege -> Einfuehrung in Perl
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ppm1
 2004-02-18 22:59
#80133 #80133
User since
2003-09-14
142 Artikel
BenutzerIn
[default_avatar]
ok. Danke dafür.

Ich hoffe mal ich bekomme es so hin.


@Strat: Wenn du auf deiner (???) Seite unter der Einführung in Perl noch so Lesezeichen zeug rein machst, wäre es (noch) besser, da man dann alles besser durchsuchen könnte... und schneller das zu Suchende finden..


ist es eigentlich besser wenn ich es so mache:


1. $rein =~ m/[+-*/]/

oder

2. $rein =~ m/+/ or $rein =~ m/-/ usw?!?

Patrick Müller
esskar
 2004-02-19 00:00
#80134 #80134
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
meistens gilt: je kürzer umso besser - solange es noch das tut, was es tun soll!
Strat
 2004-02-19 00:27
#80135 #80135
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das mit dem Index versuche ich noch.

[quote=ppm1,18.02.2004, 21:59]
1. $rein =~ m/[+-*/]/
[/quote]
Achtung!
[a-z] ist eine Zeichenklasse der Buchstaben a,b,c, ...., z

wenn du in [] ein - verwenden willst, musst du es escapen, oder an den anfang oder das ende stellen, z.B. [-+*] oder [+*-], aber besser [+\-*]
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2004-02-19 12:07
#80136 #80136
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=ppm1,18.02.2004, 16:01]
$rein =~ m/[+-*/]/

Was meinst du mit 4 Indexaufrufen?[/quote]

1) - in Zeichenklassen haben Sonderbedeutung (wie ich schon erwähnte), deshalb nach vorn oder nach hinten:
if ($rein =~ m~[-+*/]~) {...}

2) 4 x index auf die 4 Zeichen dürfte wohl schneller sein. Aber wie gesagt, sowas würd ich nur dann Ändern, wenn es erwiesenermaßen ein Nadelöhr ist.
Damit meine ich:

Code: (dl )
if (index($rein, '+') > -1 or index($rein, '-') > -1 or index($rein, '*') > -1 or index($rein, '/') > -1) {...}
\n\n

<!--EDIT|Crian|1077185586-->
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
Crian
 2004-02-19 12:18
#80137 #80137
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Es wäre mal interessant eine Geschwindigkeitsmessung mit einer geeigneten großen Textmengen an Strings vorzunehmen zwischen den Varianten (ich nehm jetzt mal $_ statt $rein):

a) if (m~(?:-|\+|\*|/)~) {...}
b) if (m~-~ or m~\+~ or m~\*~ or m~/~) {...}
c) if (m~[-+*/]~) {...}
d) if (m~[-]~ or m~[+]~ or m~[*]~ or m~[/]~) {...}
e) if (index($_, '-') > -1 or index($_, '+') > -1 or index($_, '*') > -1 or index($_, '/') > -1) {...}\n\n

<!--EDIT|Crian|1077186070-->
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
Strat
 2004-02-19 14:50
#80138 #80138
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn man die kritischen Stellen in Subroutinen packt, kann man mit CPAN:Devel::DProf oft herausfinden, wo da eine Optimierung ueberhaupt sinn machen koennte. Denn wenn man nur um des Optimierens wegen optimiert, verbraet man nur unnoetig Arbeitszeit, und handelt sich auch unleserlichen und unwartbaren Code ein, der dann noch mehr Entwicklungszeit kostet und auch viel unflexibler wird.

Quote
Die goldene Regel zum Optimieren:
Optimiere nie
Wenn du unbedingt optimieren musst, dann optimiere spaeter
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2004-02-19 18:51
#80139 #80139
Ok... Kann das einer von euch gerade mal testen, was schneller ist?

Mal was anderes:


Wie man CPAN: Devel::DProf einsetzt weiß ich zwar, aber :!: ich verstehe nicht ganz die Daten die es ausgibt... ist irgendwie zuuu hoch für mich... Alle möglichen listen... von 1 MB zahlen, buchstaben usw....

kann mir dajemand helfen?
eisbeer
 2004-02-19 19:38
#80140 #80140
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code: (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
#!/usr/bin/perl

use Benchmark;

$rein = '+5000*';

timethese(10000000, {
A => sub {
if ($rein =~ m~(?:-|\+|\*|/)~) {
# Do nothing
}
},
B => sub {
if ($rein =~ m~-~ or m~\+~ or m~\*~ or m~/~) {
# Do nothing
}
},
C => sub {
if ($rein =~ m~[-+*/]~) {
# Do nothing
}
},
D => sub {
if ($rein =~ m~[-]~ or m~[+]~ or m~[*]~ or m~[/]~) {
# Do nothing
}
},
E => sub {
if (index($_, '-') > -1 or index($_, '+') > -1 or index($_, '*') > -1 or index($_, '/') > -1) {
# Do nothing
}
}
});


Code: (dl )
1
2
3
4
5
6
7
8
9
10
Benchmark: timing 1000000 iterations of A, B, C, D, E...
A: 1 wallclock secs ( 0.80 usr + 0.00 sys = 0.80 CPU) @ 1246882.79/s
B: 1 wallclock secs ( 1.07 usr + 0.00 sys = 1.07 CPU) @ 932835.820/s
C: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 1562500.00/s
D: 1 wallclock secs ( 0.95 usr + -0.01 sys = 0.94 CPU) @ 1063829.79/s
E: 2 wallclock secs ( 1.45 usr + 0.00 sys = 1.45 CPU) @ 688705.230/s

Windows 2000SP3
1,4 GHZ
1024 MB RAM


Wir sehen:
Die Indexmethode ist diesmal nicht schneller,
der Rest ist relativ gleich. C is am schnellsten.
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
ptk
 2004-02-19 19:46
#80141 #80141
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Guest,19.Feb..2004, 17:51]Ok... Kann das einer von euch gerade mal testen, was schneller ist?

Mal was anderes:


Wie man CPAN: Devel::DProf einsetzt weiß ich zwar, aber :!: ich verstehe nicht ganz die Daten die es ausgibt... ist irgendwie zuuu hoch für mich... Alle möglichen listen... von 1 MB zahlen, buchstaben usw....

kann mir dajemand helfen?[/quote]
Man verwendet dprofpp, um die ausgegebene Datei zu analysieren.
<< |< 1 2 3 4 5 6 >| >> 60 Einträge, 6 Seiten



View all threads created 2004-02-16 23:16.