2008-11-10 12 views
47

En Python, si je fais ceci:Comment puis-je répéter une chaîne N fois en Perl?

print "4" * 4 

Je reçois

> "4444" 

En Perl, je me

> 16 

est-il un moyen facile de faire l'ancien en Perl?

+0

Cela est également possible avec les variables de chaîne (et les expressions de chaîne), voir [ma réponse] (http://stackoverflow.com/a/30100928/2932052). – Wolf

Répondre

86
$ perl -e 'print "4"x4; print "\n"' 
4444 

L'opérateur x est documenté dans perloc perlop. Ici binaire signifie un opérateur prenant deux arguments, pas composé de bits, d'ailleurs.

Binaire "x" est l'opérateur de répétition. Dans un contexte scalaire ou si l'opérande gauche n'est pas entouré de parenthèses, il renvoie une chaîne constituée de l'opérande de gauche répété le nombre de fois spécifié par l'opérande droit . Dans le contexte de liste, si l'opérande gauche est entre parenthèses ou est une liste formée par "qw/STRING/", il répète la liste. Si l'opérande correct est zéro ou négatif, il renvoie une chaîne vide ou une liste vide , selon le contexte.

 print ’-’ x 80;    # print row of dashes 

     print "\t" x ($tab/8), ’ ’ x ($tab%8);  # tab over 

     @ones = (1) x 80;   # a list of 80 1’s 
     @ones = (5) x @ones;  # set all elements to 5 

perl -e est conçu pour exécuter du code Perl à partir de la ligne de commande:

 
$ perl --help 
Usage: perl [switches] [--] [programfile] [arguments] 
    
    -e program  one line of program (several -e's allowed, omit programfile) 
+0

parfait, merci :) – izb

+1

Juste une remarque - il peut ne pas être clair pour tous les utilisateurs de perl (en particulier les nouveaux) ce que fait l'option -e, il serait donc préférable de fournir un exemple de code direct. –

+0

'perl -Esay + 4x4' Ici, '-E' active 'utiliser 5.010' (en particulier - la fonction 'dire'). 'say" $ var "' est identique à 'print" $ var \ n "'. Dans un contexte scalaire, l'opérateur 'x' renvoie toujours une chaîne, il n'est donc pas nécessaire d'utiliser des guillemets ici. – jfs

16

Il est très similaire à Perl

print "4" x 4; 
39

En Perl, vous voulez utiliser la opérateur "x".

Notez la différence entre

"4" x 4 

et

("4") x 4 

L'ancien produit une chaîne répétée:

"4444" 

cette dernière une liste répétée:

("4", "4", "4", "4") 
+0

vous faites un bon point là –

+3

En Perl 6 l'opérateur 'x' renvoie toujours la chaîne (l'opérande gauche est évaluée dans un contexte de chaîne par exemple, 4x4 ->" 4 "x4 ->" 4444 "),' xx' - une répétition op pour les listes par exemple, 4xx4 -> (4) xx4 -> (4,4,4,4). – jfs

8

FWIW, c'est aussi print 4 x 4 en Perl.

En général, en Perl, les opérateurs sont monomorphes, ie. vous avez différents ensembles d'opérateurs pour la sémantique des chaînes, pour la sémantique numérique, pour la sémantique au niveau du bit, etc., où cela a du sens, et le type des opérandes importe peu. Lorsque vous appliquez un opérateur numérique à une chaîne, la chaîne est d'abord convertie en un nombre et vous obtenez l'opération demandée (par exemple multiplication), et lorsque vous appliquez un opérateur de chaîne à un nombre, il est transformé en chaîne et vous obtenir l'opération que vous avez demandée (par exemple, la répétition). Perl prête attention à l'opérateur en premier et les types d'opérandes seulement en second - si en effet cela leur rapporte n'importe quel esprit.Ceci est l'opposé de Python et de la plupart des autres langages, où vous utilisez un ensemble d'opérateurs, et les types d'opérandes déterminent la sémantique que vous obtiendrez - ie. les opérateurs sont polymorphes.

+1

Le fait que vous pouvez ne signifie pas que vous devriez, nécessairement. Je pense que clarifier les intentions rend le code plus lisible pour tout le monde. Omettre des citations le rend moins lisible à mes yeux. –

+1

a) Avez-vous vu quelque chose dans ma réponse à propos de ce que vous devriez ou ne devriez pas faire? (Il est peu probable que ce '4 x 4' apparaisse textuellement dans le vrai code Perl.) B) Si c'est moins lisible pour vous, vous faites attention aux mauvaises choses (les formes des opérandes, plutôt que l'opérateur) . –

+2

a) Avez-vous vu quelque chose dans mon commentaire à savoir si vous avez dit ce que vous deviez ou ne devriez pas faire? b) Quand vous traitez de nombreuses langues presque quotidiennement, chaque petit geste vous aide. L'utilisation de guillemets est totalement claire et non ambiguë dans (presque) n'importe quel langage, les omettre signifie une étape mentale supplémentaire à prendre. –

1

Toutes les réponses, étant donné jusqu'à présent, manqué de mentionner que l'opérateur x ne fonctionne pas seulement sur les chaînes littérales, mais aussi sur les variables de chaîne ou expressions qui construisent des chaînes:

$msg = "hello "; 
print $msg x 2; 
print ($msg x 2) x 2; 
1

Si vous voulez imprimer 10 caractères s "A", vous pouvez aussi le faire

perl -e 'print "A" x 10'; echo 

Exemple avec sortie

[email protected]:~$ perl -e 'print "A" x 10'; echo 
AAAAAAAAAA 
[email protected]:~$ 
Questions connexes