es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cmake string para obtener pares de clave valor de una lista de cadenas que contiene claves y valores separados por dos puntos.

Tengo una lista de cadenas (input):

set(MY_LIST "A:1;B:2;C:3")

Quiero obtener los valores clave utilizando un bucle foreach y configurarlos como constantes CMake. Algo así como:

foreach(ITEM ${MY_LIST})
SET(<ITEM_A> <value_ofA>)
endforeach()

Básicamente, quiero obtener el siguiente resultado pero usando un bucle for:

SET(A "1")
SET(B "2")
SET(C "3")

¿Cómo puedo lograr esto usando foreach para navegar por cada cadena en mi lista y establecer las parejas clave-valor como constantes CMake?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado usando foreach, primero puede dividir la lista de cadenas MY_LIST en pares de claves-valor individuales usando el comando string(REGEX MATCHALL) y expresiones regulares. Luego, recorra cada par usando foreach y divida el par en clave y valor usando el comando string(REPLACE). Finalmente, establezca el par de clave-valor como una constante de CMake utilizando el comando SET.

    Aquí está el código para implementar el enfoque anterior:

    set(MY_LIST "A:1;B:2;C:3")
    
    # dividir MY_LIST en pares de claves-valor individuales
    string(REGEX MATCHALL "\\w+:[^;]*" PAIRS "${MY_LIST}")
    
    # recorrer cada par y dividir en clave y valor
    foreach(PAIR ${PAIRS})
      string(REPLACE ":" ";" KV "${PAIR}")
      list(GET KV 0 KEY)
      list(GET KV 1 VALUE)
      SET(${KEY} "${VALUE}")
    endforeach()
    
    # imprimir las constantes
    message("A = ${A}")
    message("B = ${B}")
    message("C = ${C}")
    

    Esto producirá la siguiente salida:

    A = 1
    B = 2
    C = 3
    

    Aquí, la expresión regular \\w+:[^;]* coincide con uno o más caracteres de palabra (letras, dígitos o guion bajo) seguido de dos puntos y cero o más caracteres diferentes al punto y coma. Esto coincide con cada par de claves-valor en la lista de cadenas MY_LIST.

    El comando string(REPLACE) reemplaza el delimitador : con ;, para que la clave y el valor puedan separarse usando el comando list(GET). Luego, el comando SET establece el par de claves-valor como una constante de CMake.

    Finalmente, imprimimos las constantes usando el comando message.

Comments are closed.