Schrift
[thread]8935[/thread]

teil einer zeichenkette verwenden - wie?



<< >> 8 Einträge, 1 Seite
Gast Gast
 2007-04-21 14:50
#76108 #76108
servus miteinander

ich habe folgendes problem: ich lese via perl eine sql datenbank aus...ein datensatz sieht folgendermaßen aus: "aaa - bbb" ... ich will nun nur das vor dem strich ausgeben...wie mach ich das? habe mir schon diverse dinge zur split funktion durchgelesen, habs aber damit irgendwie net hinbekommen...

danke schonmal
renee
 2007-04-21 15:31
#76109 #76109
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
my $string = "aaa - bbb";
my ($part) = split /-/,$string,2;
print $part;
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/
betterworld
 2007-04-21 16:03
#76110 #76110
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Ich wuerde dafuer aber nicht split benutzen, weil man ja nicht die beiden Teile (vor und nach dem Strich) braucht, sondern eben nur den Teil davor.  Also:
Code (perl): (dl )
1
2
3
my $string = "aaa - bbb";
my ($part) = $string =~ m/^([^-]*)/;
print $part;

Hierbei werden mit dem regulaeren Ausdruck vom Anfang des Strings alle zusammenhängenden Zeichen abgegriffen, die kein "-" sind.
renee
 2007-04-21 16:26
#76111 #76111
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Split dürfte aber schneller sein als die RegEx...
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/
holli
 2007-04-21 16:38
#76112 #76112
User since
2003-10-01
6 Artikel
BenutzerIn
[Homepage] [default_avatar]
Welche Datenbank benutzt du denn? U.U. kann man das schon in der Datenbank machen. Ansonsten geht auch

Code: (dl )
1
2
my $string = "aaa - bbb";
my $teil = substr($string, 0, index($string, "-"));


Weniger flexibel als die beiden anderen Varianten aber dafür schneller.
pq
 2007-04-21 17:31
#76113 #76113
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=renee,21.04.2007, 14:26]Split dürfte aber schneller sein als die RegEx...[/quote]
wieso das?
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
betterworld
 2007-04-21 17:41
#76114 #76114
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=pq,21.04.2007, 15:31][quote=renee,21.04.2007, 14:26]Split dürfte aber schneller sein als die RegEx...[/quote]
wieso das?[/quote]
Das wuesste ich auch gerne.  Man muss beachten, dass split ja auch einen regulaeren Ausdruck benutzt.

Ich habe es mal gebenchmarkt:
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
25
use strict;
use warnings;
use Benchmark qw(cmpthese);

my $klein = 'alpha - beta';

cmpthese (0, {
        m_klein => sub {
            my ($part) = $klein =~ m/^([^-]*)/;
        },
        split_klein => sub {
            my ($part) = split /-/,$klein,2;
        },
    });

my $gross = 'alpha - ' . 'beta' x 10000;

cmpthese (0, {
        m_gross => sub {
            my ($part) = $gross =~ m/^([^-]*)/;
        },
        split_gross => sub {
            my ($part) = split /-/,$gross,2;
        },
    });

Ergebnis:
Code: (dl )
1
2
3
4
5
6
                Rate     m_klein split_klein
m_klein     656550/s          --        -21%
split_klein 834204/s         27%          --
              Rate split_gross     m_gross
split_gross 38948/s          --        -53%
m_gross     82317/s        111%          --

Offenbar ist split bei kleinen Strings tatsaechlich etwas schneller (was man vielleicht durch Optimieren meines Regexes beheben kann), aber bei grossen Strings schneidet split weitaus schlechter ab.  Das lieght imho daran, dass der lange zweite Teil des Strings sinnlos durch die Gegend kopiert werden muss.
holli
 2007-04-21 23:34
#76115 #76115
User since
2003-10-01
6 Artikel
BenutzerIn
[Homepage] [default_avatar]
index() ist am schnellsten:
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
use strict;
use warnings;
use Benchmark qw(cmpthese);

my $klein = 'alpha - beta';

cmpthese (0, {
m_klein => sub {
my ($part) = $klein =~ m/^([^-]*)/;
},
split_klein => sub {
my ($part) = split /-/,$klein,2;
},
mit_index => sub {
my $part = substr($klein,0,index($klein, "-"));
}
});

my $gross = 'alpha - ' . 'beta' x 10000;

cmpthese (0, {
m_gross => sub {
my ($part) = $gross =~ m/^([^-]*)/;
},
split_gross => sub {
my ($part) = split /-/,$gross,2;
},
mit_index => sub {
my $part = substr($gross,0,index($gross, "-"));
}
});


Ergibt bei mir

Code: (dl )
1
2
3
4
5
6
7
8
9
        
Rate m_klein split_klein mit_index
m_klein 302083/s -- -12% -82%
split_klein 344837/s 14% -- -79%
mit_index 1653727/s 447% 380% --
Rate split_gross m_gross mit_index
split_gross 41553/s -- -18% -98%
m_gross 50924/s 23% -- -97%
mit_index 1764431/s 4146% 3365% --
<< >> 8 Einträge, 1 Seite



View all threads created 2007-04-21 14:50.