Schrift
[thread]6987[/thread]

Split und Klammern

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Matthias
 2005-05-12 14:03
#54837 #54837
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Hallo,

Die split-Funktion kann ja mittels Klammern im regulären Ausdruck auch Trennsymbole mit zurückgeben.
Wenn jedoch der reguläre Ausdruck auch noch eine ungeklammerte Alternative enthält, wird "undefiniert" zurückgegeben, wenn diese alternative zutrifft.

Kann man dieses Verhalten umgehen?

Beispiel:

Ich möchte an Whitespace und "=" trennen, wobei "=" mit ins Array wandern sollen.

Code (perl): (dl )
1
2
$string = "a=b c=d";
@array = split /(=)|\s/, $string;


liefert da, wo das Leerzeichen stand, einen undefinierten Wert.

Gibt es eine Möglichkeit, das zu umgehen?

Danke

Matthias
J-jayz-Z
 2005-05-12 14:14
#54838 #54838
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
mach doch einfach:
Code: (dl )
1
2
3
4
5
6
$string = "a=b c=d";
@array = split /(=)|\s/, $string;
foreach (@array)
{
$_ =~ s/\s(.*)/$1/;
}

ungetestet...

EDIT: Klammer vergessen...

Nochmal EDIT:
Hab was überlesen...
mach doch einfach eine foreach schleife auf @array, teste ob es undefiniert ist, wenn ja, nimm es aus dem arrayindex raus...\n\n

<!--EDIT|J-jayz-Z|1115893010-->
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
Matthias
 2005-05-12 14:20
#54839 #54839
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Damit (einschließlich der geänderten Klammer) habe ich immer noch Leerstrings im Array. Diese könnte ich natürlich mit splice oder so rauswerfen.

Gibt es evtl. eine einfachere/elegantere Möglichkeit, den Array ohne leere oder undefinierte Strings zu bekommen?

Grüße

Matthias
Matthias
 2005-05-12 14:30
#54840 #54840
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Der folgende Code funktioniert bei mir:

Code (perl): (dl )
1
2
3
4
5
6
7
$string = "a=b c=d";
@array = split /(=)|\s/, $string;

for ($i = 0; $i <= $#array; $i++)
{
    splice(@array,$i,1) unless defined $array[$i];
}


Geht das auch mit foreach oder noch einfacher?
renee
 2005-05-12 14:31
#54841 #54841
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
nein, split liefert undef zurück (siehe perldoc -f split --> letzter Absatz)...

Aber ohne foreach:
Code: (dl )
1
2
3
my $string = "a=b c=d";
my @array = split /(=)|\s/, $string;
@array = grep{defined $_}@array;
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/
Crian
 2005-05-12 15:07
#54842 #54842
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
oder soetwas wie
Code: (dl )
1
2
3
4
my @array = split /\s/, $string;
for my $i (reverse 0 .. $#array) {
$array[$i] = splice @array, $i, 1, split(/(=)/, $array[$i]);
}
\n\n

<!--EDIT|Crian|1115896089-->
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
Dubu
 2005-05-15 03:46
#54843 #54843
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Oder in zwei Schritten splitten:
Code: (dl )
1
2
my $string = "a=b c=d";
my @array = map { split /(=)/ } split /\s/, $string;
Crian
 2005-05-17 11:56
#54844 #54844
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Jau, das ist die elegantere Formulierung meines Codes :-)
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-05-17 12:11
#54845 #54845
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
es gibt bei regulären ausdrücken nicht nur die möglichkeit zeichen zu matchen, sondern auch die positionen zwischen zwei zeichen. damit ist folgende lösung möglich.
Code: (dl )
1
2
my $string = "a=b c=d";
my @array = split /\s|(?==)|(?<==)/, $string;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Matthias
 2005-05-17 15:31
#54846 #54846
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Den regexp-Operator $< kenne ich noch gar nicht. Ist das ein Lookbehind?
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-05-12 14:03.