Façon la plus simple d'inverser l'ordre des chaînes de caractères dans une variable

StackOverflow https://stackoverflow.com/questions/52674

  •  09-06-2019
  •  | 
  •  

Question

Disons que vous avez une variable dans un fichier makefile fragment comme suit:

MY_LIST=a b c d

Comment puis-je inverser l'ordre de cette liste?J'ai besoin de:

$(warning MY_LIST=${MY_LIST}) 

pour montrer

MY_LIST=d c b a

Edit:le vrai problème est que

ld -r some_object.o ${MY_LIST}

produit un a.out avec les symboles non définis, parce que les éléments de MY_LIST sont en fait des archives, mais dans le mauvais ordre.Si l'ordre de MY_LIST est inversée, elle permettra de relier correctement (je pense).Si vous connaissez une façon plus intelligente pour obtenir le lien de la commande, selon l'indice de me dans.

Était-ce utile?

La solution

Une solution pure de GNU make:

par défaut:tous

foo = veuillez inverse de moi

inverse = $(si $(1),$(appel inverse,$(liste des mots de 2,$(mots $(1)),$(1)))) $(firstword $(1))

tous :@echo $(appel inverse,$(foo))

Donne:

$ faire

moi inverser veuillez

Autres conseils

Doh!Je pourrais avoir simplement utilisé un script shell-let:

(for d in ${MY_LIST}; do echo $$d; done) | tac

Vous pouvez également définir des groupes de recherche avec ld:

ld -r foo.o -( a.a b.a c.a -)

Va itérer sur un.a, b.a et c.un jusqu'à ce qu'aucune nouvelle non résolues, les symboles peuvent être satisfaits par n'importe quel objet dans le groupe.

Si vous utilisez gnu ld, vous pouvez aussi faire:

ld -r -o foo.o --whole-archive bar.a

Ce qui est légèrement plus forte, en ce qu'elle comprendra tous les objets de la barre.une indépendamment du fait qu'il répond à un symbole non résolu de foo.o.

Une amélioration de la GNU make solution:

inverse = $(si $(liste de mots 2,2,$(1)),$(appel inverse,$(liste des mots de 2,$(mots $(1)),$(1))) $(firstword $(1)),$(1))

  • une meilleure condition de s'arrêter, original utilise une chaîne de caractères vide perdre un appel de fonction
  • ne pas ajouter un espace à la liste inversée, contrairement à l'original

Jouant sur les deux Ben Collins et elmarco de l' les réponses, voici un punt pour bash qui gère les espaces "correctement"1

reverse = $(shell printf "%s\n" $(strip $1) | tac)

ce qui fait la bonne chose, grâce à $(shell) automatiquement le nettoyage des espaces et printf automatiquement le formatage de chaque mot dans son arg liste:

$(info [ $(call reverse,  one two   three four  ) ] )

rendements:

[ four three two one ]

1...d'après mon peu de cas de test (c'est à dire, le $(info ...) ligne, ci-dessus).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top