De maneira mais simples, para inverter a ordem de seqüências de caracteres em uma variável

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Digamos que você tenha uma variável em um makefile fragmento como o seguinte:

MY_LIST=a b c d

Como faço para, em seguida, inverter a ordem da lista?Eu preciso:

$(warning MY_LIST=${MY_LIST}) 

para mostrar

MY_LIST=d c b a

Editar:o problema real é que

ld -r some_object.o ${MY_LIST}

produz um a.out com o indefinido símbolos porque os itens MY_LIST são, na verdade, arquivos, mas na ordem errada.Se a ordem de MY_LIST é invertida, ela irá vincular corretamente (eu acho).Se você sabe de uma maneira mais inteligente de obter a ordem de ligação direita, pista me.

Foi útil?

Solução

Uma solução pura GNU make:

padrão:todos

foo = por favor reverso de mim

reverter = $(se $(1),$(chamada de reversa,$(wordlist 2,$(palavras $(1)),$(1)))) $(firstword $(1))

todos :@echo $(chamada reverse,$(foo))

Dá:

$ make

me inversa, por favor

Outras dicas

Doh!Eu poderia ter usado um script de shell-let:

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

Você também pode definir grupos de pesquisa com ld:

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

Irá iterar através de um.a, b.a e c.até que nenhuma nova não resolvidos símbolos podem ser satisfeitas por qualquer objeto no grupo.

Se você estiver usando o gnu ld, você também pode fazer:

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

O que é um pouco mais forte, em que ele irá incluir todos os objetos a partir de uma barra.um, independentemente de se satisfaz um símbolo não resolvido de foo.o.

Uma melhoria para o GNU make solução:

reverter = $(se $(wordlist 2,2,$(1)),$(chamada de inversa,$(wordlist 2,$(palavras $(1)),$(1))) $(firstword $(1)),$(1))

  • melhor condição de parada, original usa a cadeia vazia, desperdiçando uma chamada de função
  • não adicionar um espaço à esquerda para a lista reversa, ao contrário do original

Jogando fora de ambos os Ben Collins e da elmarco respostas, aqui está um punt para o bash, que lida com espaços em branco "corretamente"1

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

o que faz a coisa certa, graças a $(shell) limpeza automática de espaços em branco e printf automaticamente a formatação de cada palavra em seu arg lista:

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

rendimento:

[ four three two one ]

1...de acordo com minha limitada do caso de teste (por exemplo, o $(info ...) linha, acima).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top