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 '…' 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