seth: Knobelaufgabe

Beitrag lesen

gudn tach!

Da würde ich ein simples

my @blubb = grep /./ => split(/((?:&(?:#\d+|\w+);|[^;])+?);/, $text);


> vorschlagen.  
  
das sieht - mal abgesehen davon, dass es noch fehlerhaft ist - jetzt allerdings immer weniger nach einem fall fuer split aus.  
mit grep /./ wuerde uebrigens irrtuemlich ein leeres element geloescht, wenn ein semikolon am anfang (oder ende) stehen wuerde oder auch bei zwei direkt aufeinander folgenden semikolons.  
  
kurz: man kann sich auch einfach gleich einen kleinen parser bauen.  
mein vorschlag:  
~~~perl
  
$_ = 'Test; Bla ϑ Blubb; Fred & Barney; Meyer & Co.; nicht … und so weiter';  
my @arr = ($_); # fuer den fall, dass kein semikolon vorhanden ist -> vorinitialisieren  
for(my $i=0; /\G((?:[^;&]|&(?:#\d+|\w+);|& )*);(?=(.*)$)/gc; ++$i){  
 $arr[$i] = $1;  
 $arr[$i+1] = $2;  
}  
map {print $_,"\n";} @arr;

das alternative subpattern /& / kann raus, falls einzeln stehende und-zeichen nicht vorkommen koennen.
das locale-abhaengige /\w+/ wuerde ich ersetzen durch die wirklich erlaubten zeichen.

hab ich was uebersehen?

prost
seth

ps:
zum split-code:

Allerdings trennt er bei mir bei

my $text = 'Test; Bla ϑ Blubb; Fred & Barney; Meyer & Co.; nicht … und so weiter';


> auch nach dem letzten … auf. Anscheinend will der "\#\d+"-Teil nicht so recht greifen :(  
  
doch (uebrigens muss die raute nicht maskiert werden), aber per backtracking wird schliesslich '&#8230' von /[^;]+/ gematcht wird.  
aber auch /[^;&]+/ wuerde hier nicht zum ziel fuehren, weil bei dem split-regexp ja nirgends gesagt wird, ab welcher gematcht werden soll. es muss ja nicht jedes zeichen im string gematcht werden.  
  
prost  
seth