2010-07-08 8 views
2

J'ai une chaîne comme ceci:Comment inverser l'ordre de deux mots dans une chaîne?

$a = "Mike , Tree "; 

Je veux inverser la "Tree, Mike".

Y at-il une fonction pour faire cela?

+0

je suis ne sais pas qui je peux accepter réponse .. parce que les deux réponse est bonne ... – Tree

+0

est le changé des espaces importants? – Svante

+0

yes ................. – Tree

Répondre

9

Utilisez la fonction reverse:

$reversed = join(",", reverse split(",", $string)); 
+0

hey c'est une fonctionnalité de fantaisie en perl ... j'aime bien. –

+0

Cet exemple de code n'utilise pas la fonction inverse dans un contexte scalaire. – mob

+0

corrigé. THX. – miku

1

Si vous êtes assuré la votre chaîne que vous voulez être inversé seront séparés par des virgules puis je diviser la chaîne à la virgule, puis passer par le tableau, il produit de sa longueur à 0 et l'ajoute à une chaîne vide.

10

Divisez la chaîne en deux chaînes, retournez-les et rejoignez-les.

Ou, utilisez une expression régulière:

$a =~ s/(.+),(.+)/\2,\1/g; 
+0

Mieux que Roque réponds de mon point de vue car l'expression rationnelle vous permet de mieux contrôler l'espace supplémentaire. Dans votre cas, je ferais exactement $ a = ~ s/(\ S +) \ s *, \ s * (\ S +)/\ 2, \ 1/g; – radius

+5

\ 1, etc dans le côté de remplacement est longtemps obsolète et déclenchera un avertissement; faites ceci à la place: '$ a = ~ s /(.+),(.+)/$ 2, $ 1/g;' – ysth

+0

Sa bonne réponse – Tree

1

Juste pour votre problème.

$a =~ s/([A-Za-z]+)([^A-Za-z]+)([A-Za-z]+)/$3$2$1/; 

[[email protected] trunk]$ perl -E '$a = "Mike , Tree "; $a =~ s/([A-Za-z]+)([^A-Za-z]+)([A-Za-z]+)/$3$2$1/; say $a;' 
Tree , Mike