2009-08-01 15 views
13

Po pierwsze, jestem nowicjuszem Erlang. Muszę połączyć się z bazą danych MySQL i znalazłem erlang-mysql-driver. Próbuję tego i jestem nieco zdezorientowany przez jakąś składnię.> symbole w Erlang

mogę uzyskać wiersz danych z bazy danych z tego (znacznie uproszczone dla zwięzłość tutaj):

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 

Więc teraz tutaj jest przykładem tego, co `Res' posiada:

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

Rozumiem, że to lista rekordów. W tym przypadku zapytanie zwróciło 1 wiersz z 2 kolumn.

Moje pytanie brzmi:
Co oznaczają << i >> symbole oznaczają? A co jest najlepsze (Erlang zalecany) składnia do toczenia listę podobnego do ewidencji które zostały zdefiniowane następująco:

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

Odpowiedz

15

Wystarczy mała uwaga: wyniki nie są ciągiem bitowym pojmowania per see, są to tylko ciągi bitów. Jednak można użyć wyrażeń łańcuchowych bitów do wygenerowania sekwencji ciągów bitów (która jest opisana powyżej z generatorami i tym), podobnie jak wyliczenia list i list.

możesz użyć erlang: binary_to_list/1 i erlang: list_to_binary/1 do konwersji pomiędzy binarnymi i łańcuchami (listami).

Powód, dla którego sterownik mysql zwraca ciągi bitów to prawdopodobnie, ponieważ są one znacznie szybsze do manipulowania.

+0

Znalazłem bitstring_to_list, który działał. Będę musiał również przejrzeć listę binary_to_list. Udało mi się sprawić, by mój kod działał, ale zawsze staram się poprawić jego działanie. – marcc

1

nieco strunowe listowych.

Wykrywanie ciągów bitów jest analogiczne do rozumienia list. Służą do wydajnego i zwięzłego generowania ciągów bitowych.

łańcuch bitów Ułatwienia są pisane z następującą składnią:

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

łańcuch bitów jest wyrazem nieco ciąg, a każdy Qualifier jest albo generator, generator bitowy ciąg lub filtr.

• generator jest zapisana jako:

Pattern <- ListExpr. 

ListExpr musi być wyrażeniem, które ocenia się na liście terminów.

• generator bitowy ciąg jest zapisana jako:

BitstringPattern <= BitStringExpr. 

BitStringExpr musi być wyrażeniem, którego wynikiem jest łańcuch bitów.

• Filtr jest wyrażeniem, które zwraca wartość prawda lub fałsz. Zmienne we wzorcach cieni generatora w klauzuli funkcji otaczającej wyrażenia ciągu bitów.

Zrozumienie ciągu bitów zwraca ciąg bitów, który jest tworzony przez konkatenację wyników oceny BitString dla każdej kombinacji elementów generujących ciągi bitów, dla których wszystkie filtry są prawdziwe.

Przykład:

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

Rozumiem. Dziękuję za odpowiedź. Mam zamiar spróbować napisać wiersz MySQL -> Nagraj teraz i zobacz, co się stanie ... – marcc

+0

W moim przypadku nie mam żadnych filtrów ani generatorów, więc wygląda na to, że mogę po prostu wywołać erlang: bitstring_to_list/1. Dziękuję bardzo! – marcc

+2

Najważniejszym znaczeniem << and >> jest oznaczenie samych plików binarnych. W pytaniu nie ma oznak zrozumienia łańcucha bitów! – gleber

6

W Twoim konkretnym przykładzie, można zrobić konwersję dopasowując na zwróconych wartości kolumn, a następnie utworzenie nowego rekordu takiego:

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