Строковое выражение совпадения со связанной переменной - PullRequest
4 голосов
/ 17 сентября 2010

Следующие сеансы оболочки демонстрируют поведение, которое я хотел бы понять:

1> A = "Some text".
"Some text"
2> "Some " ++ R = A.
"Some text"
3> R.
"text"
4> B = "Some ".
"Some "
5> B ++ L = A.
* 1: illegal pattern

Конечно, операторы 2 и 5 синтаксически идентичны?Я хотел бы использовать эту идиому для извлечения некоторого текста из строки, где B считывается из файла конфигурации.Возможно ли это, и какой синтаксис я должен использовать вместо того, что показан в 5) выше?

Спасибо!

1 Ответ

4 голосов
/ 17 сентября 2010

Шаблон LHS ++ RHS расширяется во время компиляции до [ lhs0, lhs1, lhs2 | RHS] (где LHS =:= [lhs0, lhs1, lhs2], и компилятор отказывается делать это для чего-либо, кроме литеральных строк / списков. Теоретически он может сделать это для переменных, но он просто нене сейчас.

Я думаю, что в вашем случае вам нужно сделать:

Prefix = read_from_config(),
TestString = "Some test string",
case lists:prefix(Prefix, TestString) of
    true ->
        %% remove prefix from target string
        lists:nthtail(length(Prefix), TestString);
    false ->
        different_prefix
end.
...