2009-08-01 14 views
13

Antes que nada, soy un novato de Erlang aquí. Necesito una interfaz con una base de datos MySQL y encontré el erlang-mysql-driver. Lo estoy probando y estoy un poco confundido por la sintaxis.<< and >> símbolos en Erlang

puedo conseguir una fila de datos de la base de datos con esta (en gran medida simplificada por razones de brevedad aquí):

Result = mysql:fetch(P1, ["SELECT column1, column2 FROM table1 WHERE column2='", Key, "'"]), 
case Result of 
    {data, Data} -> 
     case mysql:get_result_rows(Data) of 
      [] -> not_found; 
      Res -> 
       %% Now 'Res' has the row 

Así que ahora aquí es un ejemplo de lo `Res' tiene:

[[<<"value from column1">>, <<"value from column2">>]] 

entiendo que es una lista de registros. En este caso, la consulta arrojó 1 fila de 2 columnas.

Mi pregunta es:
¿Qué significan los símbolos << y >>? ¿Y cuál es la mejor (recomendado-Erlang) sintaxis para convertir una lista como esta en a anales que he definido como:

-record( 
    my_record, 
    { 
     column1 = "" 
     ,column2 = "" 
    } 
).  

Respuesta

15

Sólo una pequeña nota: los resultados no son cadenas de bits comprensiones por ver, son solo cadenas de bits. Sin embargo, puede utilizar las comprensiones de cadenas de bits para producir una secuencia de cadenas de bits (que se describe anteriormente con los generadores y eso), al igual que las listas y las listas de comprensión.

puede usar erlang: binary_to_list/1 y erlang: list_to_binary/1 para convertir entre cadenas binarias y cadenas (listas).

La razón por la cual el controlador mysql devuelve cadenas de bits es probablemente porque son mucho más rápidas de manipular.

+0

encontré que bitstring_to_list estaba funcionando. Tendré que buscar también binary_to_list. logré que mi código funcionara, pero siempre estoy buscando hacerlo más correcto. – marcc

1

Estos son comprensiones cadena de bits.

Las comprensiones de cadenas de bits son análogas a Comprensión de listas. Se utilizan para generar cadenas de bits de manera eficiente y sucinta.

comprensiones cadena de bits se escriben con la siguiente sintaxis:

<< BitString || Qualifier1,...,QualifierN >> 

cadena de bits es una expresión de cadena de bits, y cada clasificatorio es un generador, un generador de cadena de bits o un filtro.

• Un generador se escribe como:

Pattern <- ListExpr. 

ListExpr debe ser una expresión que evalúa a una lista de términos.

• Un generador de cadena de bits se escribe como:

BitstringPattern <= BitStringExpr. 

BitStringExpr debe haber una expresión que se evalúa como una cadena de bits.

• Un filtro es una expresión que se evalúa como verdadera o falsa. Las variables en los patrones del generador sombrean las variables en la cláusula de la función que rodea las comprensiones de la cadena de bits.

Una comprensión de cadena de bits devuelve una cadena de bits, que se crea al concatenar los resultados de la evaluación de BitString para cada combinación de elementos de generador de cadenas de bits para el que todos los filtros son verdaderos.

Ejemplo:

1> << << (X*2) >> || 
<<X>> <= << 1,2,3 >> >>. 
<<2,4,6>> 
+0

Ya veo. Gracias por la respuesta. Voy a tratar de escribir una fila MySQL -> Función de registro ahora y ver qué pasa ... – marcc

+0

Y en mi caso, no tengo ningún filtro o generador, así que parece que puedo simplemente llamar a erlang: bitstring_to_list/1. ¡Muchas gracias! – marcc

+2

El significado más importante de << and >> es denotar binarios en sí. ¡No hay signos de comprensión de cuerdas en la pregunta! – gleber

6

En el ejemplo específico, se puede hacer la conversión, haciendo coincidir en los valores de columna devueltos, y luego crear un nuevo registro de esta manera:

case mysql:get_result_rows(Data) of 
    [] -> 
    not_found; 
    [[Col1, Col2]] -> 
    #my_record{column1 = Col1, column2 = Col2} 
end