Frage

Dies ist für mich arbeite in 5.8 und 5.10, aber in 5.12 mein Code erstellt dieses seltsame Nicht-qr Objekt:

# running "print Dumper($regex)"
$VAR1 = bless( do{\(my $o = '')}, 'Regexp' );

Während ein qr Druck // nicht von meinem Code sieht wie folgt erstellt:

# running "print Dumper(qr/foo/i)"
$VAR1 = qr/(?i-xsm:foo)/;

Mein Code ist im Grunde:

REGEXP *rx = re_compile(pattern, flags);
SV *regex = sv_2mortal(newSVpv("",0));

sv_magic(regex, (SV*)rx, PERL_MAGIC_qr, 0, 0);

stash = gv_stashpv("Regexp", 0);
sv_bless(newRV((SV*)regex), stash);

Wer weiß, wie man richtig einen regulären Ausdruck aus einem String in 5.12 erstellen?

War es hilfreich?

Lösung

Danke für mich setzen auf dem richtigen Weg, Jungs, stellt sich heraus, dass ich ernsthaft dieses Grübeln wurde. Sie schneiden nur die magische Linie und schaffen nicht die PV.

Das ist alles, was Sie in Perl tun müssen, 5.12:

REGEXP *rx = re_compile(pattern, flags);
SV *regex = newRV((SV*)rx);

stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);

Andere Tipps

Werfen Sie einen Blick auf die Kommentare in diese Antwort von hobbs. Ich habe es kopiert unten für eine einfache Lesung:

  

Regex-Objekte erhalten tatsächlich etwas mehr „Kern“ in 5.12.0, wie sie jetzt Verweise auf Skalare vom Typ REGEXP sind eher als Referenzen auf Skalare mit Magie. Dies ist jedoch völlig unsichtbar für Benutzer-Code, es sei denn, Sie Bypass überlastet stringification verwalten, wobei in diesem Fall werden Sie feststellen, dass reguläre Ausdrücke jetzt als Regexp = REGEXP (0x1234567) anstelle von Regexp = SCALAR (0x1234567)

drucken merken

Ich bin nicht besonders vertraut mit XS, aber ich vermute, dass Sie nicht einen skalaren Wert nicht mehr verwenden können Ihre Regex zu erstellen.

Perl 5.12 regexps geändert erste Klasse seiner Objekte , die Sie im Rahmen der tangentialen Diskussion in Wie kann ich überprüfen, ob ein Skalar eine kompilierte Regex es? hat.

Ich bin kein XS Person, so dass ich weiß nicht, was Sie ändern in Ihrem Code benötigen, um es heraus zu arbeiten. Die Suche nach ‚REGEXP‘ in den Perl-Quellen zeigt die Updates, sie zu den Kernmodulen das neue Material zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top