Stefan Welscher: (RegEx) Alle Matches ersetzen

Moinsen,
sagen wir ich habe folgenden String aus einer Benutzereingabe (oder einem Template):

$cmd="CMD1=DO_THIS;CMD2=\"DO_THAT\";CMD3=\"DO_THIS;AND_THAT;AND_THAT\"";

Ich möchte die einzelnen "Befehle" anhand des Strichpunkts heraustrennen, muss aber aufpassen, dass ich Strichpunkte die in Anführungszeichen stehen, zusammenhängen lasse.
Dafür versuche ich einen RegEx zu schreiben, der im Vorfeld nicht Escapete Strichpunkte mit einem Backslash versieht.
Aktuell sieht das so aus:

$cmd=~s/(?<!\\)"([^"]*?)(?<!\\);([^"]*)(?<!\\)"/"$1\\;$2"/g;

Das Problem: Nach dem ersten Ersetzen springt die Zeigerposition auf das zweite Anführungszeichen und die anderen Strichpunkte bleiben unverändert.

Aus...  CMD1=DO_THIS;CMD2="DO_THAT";CMD3="DO_THIS;AND_THAT;AND_THAT"
wird... CMD1=DO_THIS;CMD2="DO_THAT";CMD3="DO_THIS;AND_THAT;AND_THAT"

Arbeite ich mir positiven Lookaheads für das zweite Anführungszeichen (?=[^"]*(?<!\\)") verliert der RegEx den Bezug zum Inneren der Klammer und escaped auch die Strichpunkte zwischen den Befehlen.

Bei $cmd=s/(?<!\\)"(([^"]*?)(?<!\\);)+([^"]*?)(?<!\\)"/"$2\\;$3"/g;
beinhaltet $2 scheinbar nur die letzte Wiederholung.

Natürlich könnte ich jetzt eine Schleife um den Ausdruck laufen lassen bis es keine Treffer mehr gibt, aber lässt sich das nicht auch mit RegEx selbst lösen?

Besten Dank im Voraus!

  1. use Text::ParseWords qw(parse_line);  
    @commands = parse_line(q(;), undef, 'CMD1=DO_THIS;CMD2="DO_THAT";CMD3="DO_THIS;AND_THAT;AND_THAT"');
    
  2. Moin Moin!

    $cmd="CMD1=DO_THIS;CMD2=\"DO_THAT\";CMD3=\"DO_THIS;AND_THAT;AND_THAT\"";

    Ich möchte die einzelnen "Befehle" anhand des Strichpunkts heraustrennen, muss aber aufpassen, dass ich Strichpunkte die in Anführungszeichen stehen, zusammenhängen lasse.

    Test::CSV

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Test::CSV

      Wurstfinger! Sollte natürlich Text::CSV heißen ...

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".