迪拉斯: Reg. Expression >> Zeichenkette aufteilen

Beitrag lesen

Hey,
das ist ein Fall von ausgeglichenem Text. Dafür braucht man Spezialwerkzeug.

  
  
#!perl -T  
use strict;  
use diagnostics;  
  
use Data::Dump::Streamer;  
use Text::Balanced qw(extract_delimited);  
  
our $seperator = ' ';  
our $balancedseperator = '"';  
  
sub parse {  
    # take $string  
    # return $remainder_of_string, [@parts_split_by_seperator]  
  
    $_ = shift;  
    my ($head, $tail);  
  
    if (/^$balancedseperator/) {  
        ($head, $tail) = extract_delimited $_, $balancedseperator;  
        return $tail, [$head];  
    } else {  
        if (/$balancedseperator/) {  
            ($head, $tail) = /(.*?)($balancedseperator.*)/;  
            return $tail, [split $seperator, $head];  
        } else {  
            return '', [split $seperator, $_];  
        };  
    };  
};  
  
# --  
  
while (<DATA>) {  
    chomp;  
  
    my @parts;  
    while (length) {  
        my ($remainder, $partsref) = parse $_;  
        push @parts, grep {length} @{$partsref};  
        $_ = $remainder;  
    };  
    Dump [@parts];  
};  
  
__DATA__  
Hallo ich bins der "Sieg fried"  
"Sieg fried" halli hallo  
Hallo "Sieg fried" du da "Sieg fried" la bla gna  
foo bar baz  
"Sieg fried"  

Die Sub parse beackert den übergebenen String solange, bis von ihm nichts übrig bleibt.

--
水-金-地-火-木-土-天-海-冥