Stefan Welscher: (REGEX) Negative Lookbehind bei split()

Moinsen,
es geht um folgendes Problem:

Ich habe einen String, den ich anhand von Unterstrichen teilen möchte:
PART1_PART2_PART3 => Array(PART1,PART2,PART3)

Soweit kein Problem, funktioniert problemlos mit:
my @array=split(/[_]+/,$string);

Nur dumm, dass ich jetzt Fälle habe, in denen ich den Unterstrich nicht teilen darf.
Jetzt hab ich mir gedacht, dass ich die Unterstriche dort escapen lasse wo sie nicht geteilt werden sollen, also z.B.

PART1_PART\_2_PART3 => Array(PART1,PART_2,PART3)

Dafür wollte ich negative Lookbehinds bei split verwenden:

my @array=split(/(?<!\)[_]+/,$string);

Leider unterscheidet sich das Ergebnis nicht vom ursprünglichen Split, es werden also weiter alle Unterstriche getrennt. Das Backslash zum Excapen fällt aber weg.

Was mach ich falsch?
Bzw. lassen sich die Lookahead/Lookbehind-Sachen überhaupt mit Split kombinieren?

Besten Dank!

  1. Ahhh... Fail...
    Der RegEx passt schon so, es wurde nur durch eine Syntax-Prüfung vorher das Backslash wieder gelöscht :/

  2. Leider unterscheidet sich das Ergebnis nicht vom ursprünglichen Split, es werden also weiter alle Unterstriche getrennt. Das Backslash zum Excapen fällt aber weg.

    Was mach ich falsch?

    Also hier funktioniert das:

    use 5.010;  
    my @strings = qw/ FOO1_FOO2_FOO3 BAR1_BAR2\_BAR3 /;  
    for my $s (@strings) {  
        my @array = split /(?<!\\)[_]+/, $s;  
        say "$s:";  
        say for @array;  
    }  
    
    

    Ausgabe:
    FOO1_FOO2_FOO3:
    FOO1
    FOO2
    FOO3
    BAR1_BAR2\_BAR3:
    BAR1
    BAR2\_BAR3

    Ich nehme daher einfach an, dass der Backslash gar nicht imOoriginalstring vorhanden ist.
    Das passiert, wenn du sowas schreibst:
    my $string = "FOO\_BAR";
    Wenn der String aber mit Backslash in einer Datei steht, die du ausliest, sollte der Backslash nicht verlorengehen.
    Wenn du den String im Skript erstellst, verwende z.b. single quotes:
    my $string = 'FOO\_BAR';

  3. Hi,

    Da das eigentliche Problem ja gelöst ist, noch eine ganz andere Anmerkung:

    my @array=split(/[_]+/,$string);

    Wozu eine Zeichenklasse, wenn es nur um ein einzelnes Zeichen geht?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.