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

ne vs. RegEx

Tags: Ähnliche Threads

Leser: 1


<< >> 7 Einträge, 1 Seite
pktm
 2008-08-13 01:22
#113456 #113456
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Was ist eigentlich besser?
Code: (dl )
1
2
3
4
if( $my_var ne "a" and $my_var ne "b" ) { ...keks... }

# oder
if( $my_var !~ m/^(a|b)$/ ) { ...keks... }


Oder ist das völlig egal? Wenn nicht, warum nicht?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
betterworld
 2008-08-13 01:42
#113457 #113457
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Es tut ja nicht mal das Gleiche...

Das zweite fuehrt den Block auch dann aus, wenn $my_var = "a\n" ist.

Vermutlich ist das erste auch noch schneller, das kannst Du ja benchmarken.

Edit: Ach ja, und ich glaube, Du meinst wohl beim ersten auch "and" statt "or".
pktm
 2008-08-13 01:50
#113458 #113458
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
betterworld+2008-08-12 23:42:08--
Es tut ja nicht mal das Gleiche...

Das zweite fuehrt den Block auch dann aus, wenn $my_var = "a\n" ist.

Vermutlich ist das erste auch noch schneller, das kannst Du ja benchmarken.

Edit: Ach ja, und ich glaube, Du meinst wohl beim ersten auch "and" statt "or".


Ja, ich meinte bei obigem and :)
Mal sehen, wann ich zu dem Benchmark komme.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
LanX-
 2008-08-13 12:35
#113471 #113471
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
pktm+2008-08-12 23:50:23--
Mal sehen, wann ich zu dem Benchmark komme.


selbst wenn gleichschnell wieso willst du einen Code schreiben wo du nicht sofort erkennst was genau passieren soll? Wartbarkeit?

Code (perl): (dl )
    unless ( $my_var eq "a" or $my_var eq "b" ) { ...keks... }  
pktm
 2008-08-14 00:21
#113481 #113481
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Das ist ein gutes Argument. Allerdings würde ich in diesem Falle die RegEx vorziehen. Finde ich leserlicher. unless mit mehr als einer Bedingung ist mir immer schon zu viel :>

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
LanX-
 2008-08-14 00:48
#113483 #113483
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Code (perl): (dl )
    unless ( $my_var eq "a" or $my_var eq "b" ) { ...keks... }  

oder
Code (perl): (dl )
    if ( $my_var ne "a" and $my_var ne "b" ) { ...keks... }  


ist Schnuppe, das ist die De Morgansche Regel nimm halt was im Kontext des Algorithmus klarer ist.

Wenn du kein unless magst dann schreib halt

Code (perl): (dl )
    if ( not ( $my_var eq "a" or $my_var eq "b" ) ) { ...keks... }  


Aber für die RegEx-Kanone braucht man im Zweifelsfall länger und außerdem ist sie wie gezeigt fehlerträchtiger.
Linuxer
 2008-08-14 02:28
#113485 #113485
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Die Regexkanone ist ausserdem langsamer als der direkte Vergleich...

Code: (dl )
1
2
3
4
5
6
$ perl /tmp/compare.pl 
Rate regex_alter_catch regex_alter_nocatch regex_class equal
regex_alter_catch 1286220/s -- -29% -41% -63%
regex_alter_nocatch 1803742/s 40% -- -17% -48%
regex_class 2163145/s 68% 20% -- -37%
equal 3442791/s 168% 91% 59% --


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
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;
use Benchmark qw( cmpthese );

my $text = 'a';

cmpthese(
    -1, {
        'equal' => sub {
            return if ( $text eq 'a' );
        },
        'regex_class' => sub {
            return if ( $text =~ m/^[ab]$/ );
        },
        'regex_alter' => sub {
            return if ( $text =~ m/^(a|b)$/ );
        },
        'regex_alter_nocatch' => sub {
            return if ( $text =~ m/^(?:a|b)$/ );
        },
    }
);


Und mit $text = 'b' komm ich zu folgendem Ergebnis:

Code: (dl )
1
2
3
4
5
                         Rate regex_alter_catch regex_alter_nocatch regex_class equal
regex_alter_catch 1293473/s -- -17% -39% -76%
regex_alter_nocatch 1563926/s 21% -- -26% -71%
regex_class 2104367/s 63% 35% -- -61%
equal 5367820/s 315% 243% 155% --
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< >> 7 Einträge, 1 Seite



View all threads created 2008-08-13 01:22.