2015-06-29 12 views
8

Con Erlang posso fare qualcosa di simile:Pattern matching con stringa in Erlang. Variabile in posizione sinistra

"kapa" ++ D = "kapagama". % D now has a value "gama" 

C'è un modo per mettere la "variabile" in posizione di sinistra? Qualcosa di simile

D ++ "gama" = "anyLengthStringgama". 

Per questo guscio espressione restituisce un errore:

* 1: illegal pattern 

Domanda bonus: Qualcuno può spiegare perché non funziona? Qual è la logica dietro?

risposta

7

Per questo si dovrebbe usare sia regular expression matching, o utilizzare un paio di inversioni della lista:

1> "amag" ++ D = lists:reverse("anyLengthStringgama"). 
"amaggnirtShtgneLyna" 
2> lists:reverse(D). 
"anyLengthString" 
13
"kapa" ++ D = "kapagama". 

è solo zucchero sintattico per

[$k, $a, $p, $a | D] = "kapagama". 

e questo è solo zucchero sintattico per

[$k|[$a|[$p|[$a|D]]]] = "kapagama". 

Non c'è alcuna contropartita per questo codice:

D ++ "gama" = "kapagama". 

che questo può essere zucchero sintattico per. Così come ha scritto Steve Vinoski, si deve fare uso lists:reverse/1

"amag" ++ D = lists:reverse("kapagama"), lists:reverse(D). 

o utilizzare il modulo re.

+0

Grazie per la spiegazione dello zucchero sintattico! – kharandziuk

+3

La ragione di ciò è che la corrispondenza del modello non può ** cercare **, può solo corrispondere a modelli espliciti. 'D ++" gama "' sta fondamentalmente dicendo cercare la stringa fino a trovare un '" gama "' alla fine, quindi restituire tutto prima di esso, che non funziona. – rvirding