J'apprends Perl, alors veuillez porter avec moi pour cette question noob.
Comment répéter un personnage N fois dans une chaîne?
Je veux faire quelque chose comme ci-dessous:
$numOfChar = 10;
s/^\s*(.*)/' ' x $numOfChar$1/;
Par défaut, les substitutions prennent une chaîne comme la partie à substituer. Pour exécuter du code dans le processus de substitution, vous devez utiliser le drapeau e
.
$numOfChar = 10;
s/^(.*)/' ' x $numOfChar . $1/e;
Cela ajoutera $numOfChar
espace au début de votre texte. Pour le faire pour chaque ligne du texte, utilisez l'-p
Drapeau (pour un traitement rapide, une ligne):
cat foo.txt | Perl -p -e "$n = 10; s/^(.*)/' ' x $n . $1/e/" > bar.txt
ou si cela fait partie d'un script plus important, utilisez le -g
et -m
drapeaux (-g
Pour Global, c'est-à-dire une substitution répétée et -m
faire ^
Match au début de chaque ligne):
$n = 10;
$text =~ s/^(.*)/' ' x $n . $1/mge;
Votre expression régulière peut être écrite comme suit:
$numOfChar = 10;
s/^(.*)/(' ' x $numOfChar).$1/e;
mais - vous pouvez le faire avec:
s/^/' ' x $numOfChar/e;
Ou sans utiliser Regexps du tout:
$_ = ( ' ' x $numOfChar ) . $_;
Tu as raison. Perl's x
opérateur répète une chaîne plusieurs fois.
print "test\n" x 10; # prints 10 lines of "test"
EDIT: Pour ce faire dans une expression régulière, ce serait probablement le meilleur (A.K.A. La plupart des personnes de maintenance conviviales) de simplement affecter la valeur à une autre variable.
my $spaces = " " x 10;
s/^\s*(.*)/$spaces$1/;
Il existe des moyens de le faire sans une variable supplémentaire, mais ce n'est que ma 0,02 $ qu'il sera plus facile de maintenir si vous le faites de cette façon.
EDIT: J'ai corrigé mon regex. Désolé, je ne l'ai pas lu la première fois.