use strict; use warnings; use Data::Dumper; my %hash = (':-)' => 'lachen.gif', ';-)' => 'zwinker.gif'); my $string = "Dies;-) ist ein Test :-);\na :- b"; my $smile1; { # Zeichen sammeln, mit denen Smilies beginnen können my %sc = map {$_, 1} map {substr($_, 0, 1)} keys %hash; $smile1 = join ('', map {quotemeta} sort keys %sc); } # smilies (regexp-safe) in alphabetisch absteigender Reihenfolge (get longest match) my @smiler = map {quotemeta} sort {-($a cmp $b)} keys %hash; my @splitted; push (@splitted, $1) if $string =~ /\G([^$smile1]+)/ogc; # bis zum ersten (möglichen) Smilie-Start LOOP: { foreach my $s (@smiler) { push (@splitted, [$1]), redo LOOP if $string =~ /\G($s)/gc; # eins gefunden -> redo LOOP } push (@splitted, $1), redo LOOP if $string =~ /\G(.[^$smile1]*)/ogc; # ein Zeichen und dann bis nächstem möglichen Start } print Dumper(\@splitted);