Problem mit m im Listenkontext

29/09/2011 - 13:25 von Christoph Mehdorn Weber | Report spam
Hallo!

Ich wollte gerade, wie ich das hàufig tue, eine derartige
Konstruktion verwenden (andeutungsweise, Ausdruck ist deutlich
komplizierter):

my ($type, $foo, $bar) = m{(\w+)s+(\d+)...}o;

Soweit ich mich erinnere, hat das immer so funktioniert, daß der
erste Teil in Klammern in $type landete, der zweite Klammerpart in
$foo und so weiter. Heute ist das irgendwie anders, die erste
Variable ist immer leer und alles um eins nach hinten verschoben.


Ich habe folgendes Minimalbeispiel erbaut (gibt mit strict und
warnings keine Mecker):

#v+
my @baz = split(m'(\w+)\s+.*'o, 'Foo bar');
use Data::Dumper;
print Dumper(\@baz);
print $^V, "";
#v-


Ergibt bei mir:

| $VAR1 = [
| '',
| 'Foo'
| ];
| v5.10.1

Woher kommt der obskure Leerstring im ersten Arrayelement? Wie
bekomme ich es wieder weg oder kann ich mich wenigstens darauf
verlassen, daß es jetzt immer da ist und in undef entsorgt werden
kann?

Christoph

Fuer Schulen und das Gesundheitssystem ist die NASA auch nicht zustaendig. --
Ja, aber deren Budget faellt auch nicht einfach so vom Himmel. --
Wenn man an Challenger, Columbia & Co denkt, kann man das so net sagn.
(Peter J. Holzer, Szomraky Stefan, Andreas Granig)
 

Lesen sie die antworten

#1 Bjoern Hoehrmann
29/09/2011 - 14:12 | Warnen spam
* Christoph 'Mehdorn' Weber wrote in de.comp.lang.perl.misc:
Ich wollte gerade, wie ich das hàufig tue, eine derartige
Konstruktion verwenden (andeutungsweise, Ausdruck ist deutlich
komplizierter):

my ($type, $foo, $bar) = m{(\w+)s+(\d+)...}o;

Soweit ich mich erinnere, hat das immer so funktioniert, daß der
erste Teil in Klammern in $type landete, der zweite Klammerpart in
$foo und so weiter. Heute ist das irgendwie anders, die erste
Variable ist immer leer und alles um eins nach hinten verschoben.



Ja und mit `print Dumper([ 'abc' =~ /(.)(.)(.)/ ] )` funktioniert das
auch.

Ich habe folgendes Minimalbeispiel erbaut (gibt mit strict und
warnings keine Mecker):

#v+
my @baz = split(m'(\w+)\s+.*'o, 'Foo bar');
use Data::Dumper;
print Dumper(\@baz);
print $^V, "";
#v-

Ergibt bei mir:

| $VAR1 = [
| '',
| 'Foo'
| ];
| v5.10.1

Woher kommt der obskure Leerstring im ersten Arrayelement? Wie
bekomme ich es wieder weg oder kann ich mich wenigstens darauf
verlassen, daß es jetzt immer da ist und in undef entsorgt werden
kann?



Analog zu `print Dumper([ split(/(,)/, ',') ])` ist der Leerstring das
was vor der ersten trennenden Zeichenkette steht gefolgt von dem was für
die erste Klammerung gefunden wurde. Danach ist nichts mehr übrig von
der Eingabe, und split gibt keine leeren letzten Elemente zurück.
Björn Höhrmann · mailto: · http://bjoern.hoehrmann.de
Am Badedeich 7 · Telefon: +49(0)160/4415681 · http://www.bjoernsworld.de
25899 Dagebüll · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Ähnliche fragen