Perl: split() Funktion und RegExp



  • Hi,

    ich splitte einen String in Perl folgendermaßen:

    my $str = 'This is "a test" string!'; 
    my @strp = split(/ /, $str);
    
    for(my $i=0; $i < @strp; ++$i){
         print $strp[$i] . "\n";
    }
    

    Als Ausgabe erhalte ich nun:

    This
    is
    "a
    test"
    string!
    

    Wie kann ich der split() Funktion über die Rexgular Expressions beibringen, dass sie am Leerzeichen zwischen "a test" nicht splitten soll, da dieser Ausdruck ja in Anführungszeichen steht?

    Mein Ziel ist es praktisch, folgendes Resultat zu erhalten:

    This
    is
    "a test"
    string!
    

    Besten Dank für euere Hilfe!



  • EDIT:

    Sorry hab mich beim Resultat verschrieben.
    Es soll natürlich so aussehen:

    This
    is
    a test
    string!
    

    Also die Anführungszeichen selbstverständlich nicht mehr dabei.

    Danke!



  • hmm könnte so klappen:

    my $str = 'This is "a test" string!';
    $str =~ /^([\w\s]+?)\s\"([\w\s]+?)\"\s([\w\s]+?)$/;
    my @strp = split(/ /, $1);
    push(@strp, $2);
    @strp = (@strp, split(/ /, $3);
    

    ungetestet, gerade kein Perl zur Hand...



  • Hab das ganze mal durch den Interpreter laufen lassen:

    my $str = 'This is "a test" string!';
    $str =~ /^([\w\s]+?)\s\"([\w\s]+?)\"\s([\w\s]+?)$/;
    my @strp = split(/ /, $1);
    push(@strp, $2);
    @strp = (@strp, split(/ /, $3));
    
    for(my $i=0; $i < @strp; ++$i){
    	print $strp[$i] . "\n";
    }
    

    Leider bekomme ich nichts ausgegeben. Irgendetwas funktioniert also nicht so wie es sollte..



  • ok, hier ist es leicht verändert wegen dem Ausrufezeichen:

    use strict;
    
    my $str = 'This is "a test" string!';
    $str =~ /^([\w\s]+?)\s\"([\w\s]+?)\"\s(.+?)$/;
    my @strp = split(/ /, $1);
    push(@strp, $2);
    @strp = (@strp, split(/ /, $3));
    
    foreach my $s (@strp) {
    	print "$s\n";
    }
    

Anmelden zum Antworten