Dies sollte den Trick:
my $str = ...;
$str =~ s/ \b(\w) \s+ (\w)\b /$1$2/gx;
dass der Raum zwischen den einzelnen Zeichen nach Leerzeichen entfernt. Fühlen Sie sich frei, \S
durch eine restriktivere Zeichenklasse zu ersetzen, falls erforderlich. Es kann auch einige Randfälle geben, die sich auf Interpunktionszeichen beziehen, mit denen Sie umgehen müssen, aber das kann ich anhand der von Ihnen bereitgestellten Informationen nicht erraten.
Wie Ether hilfreich zeigt, scheitert dies in einem Fall. Hier ist eine Version, die (wenn auch nicht ganz so sauber wie die ersten) funktionieren soll:
s/ \b(\w) ((?:\s+ \w\b)+) /$1 . join '', split m|\s+|, $2/gex;
Ich mochte Ether Test basierenden Ansatz (Nachahmung ist die aufrichtigste Form der Schmeichelei und alle):
use warnings;
use strict;
use Test::Magic tests => 4;
sub clean {
(my $x = shift) =~ s{\b(\w) ((?: \s+ (\w)\b)+)}
{$1 . join '', split m|\s+|, $2}gex;
$x
}
test 'space removal',
is clean('ab c d') eq 'ab cd',
is clean('a bcd e f gh') eq 'a bcd ef gh',
is clean('a b c') eq 'abc',
is clean('abc d') eq 'abc d';
Rückgabe: wie in perldoc perlre beschrieben
1..4
ok 1 - space removal 1
ok 2 - space removal 2
ok 3 - space removal 3
ok 4 - space removal 4
Danke. Deine Beschreibung ist klarer als meine; Genau das habe ich gesucht. – itzy