2016-06-13 3 views
3

Мы недавно перешли от CF 10, CF 2016 и наткнулся на следующий вопрос:неожиданное поведение с функцией replaceList

<cfscript> 

    x = "abc"; 
    x = replaceList(x, "ab|cd", "1|2", "|"); 
    writeDump(x); 

    // CF 11, CF 2016 
    // >> 12 

    // CF 10, Railo/Lucee 
    // >> 1c 

    // -------------------- 

    x = "abc"; 
    x = replaceList(x, "ab,cd", "1,2", ","); 
    writeDump(x); 

    // CF 11, CF 2016 
    // >> 1c 

    // CF 10, Railo/Lucee 
    // >> 1c 

</cfscript> 

Что здесь происходит? Почему это изменение not documented от Adobe? С чего начать?

Update:

Bug Report #4164200 подали с Adobe

ответ

2

Короткий ответ:

Я подозреваю, что это непреднамеренное и будет отчет об ошибке. Во время работы попробуйте выйти из символа трубы: replaceList(x, "ab|cd", "1|2", "\|");.

Более длинный ответ:

Внутри эта функция почти наверняка использовать какое-то регулярное выражение (где символы трубы | имеет особый смысл т.е. логического OR). Я предполагаю, что CF сначала использует String.split("regex"), чтобы разбить два списка на массивы. Затем перебирает массивы для выполнения замен.

Исходя из результатов, CF не выходит из символа трубы, в результате чего списки должны быть разделены по-разному, чем ожидалось. Каждый отдельный символ становится отдельным элементом, который, очевидно, заканчивается совпадением больше, чем вы предполагали, т.е. каждый символ в базовой строке.

list = "ab|cd"; 
writeDump(list.split("|")); 

Results of split("|")

Однако, если вы убегаете символ трубы с \, вы получите ожидаемые результаты:

list = "ab|cd"; 
writeDump(list.split("\|")); 

Results of split("\|")

+0

Спасибо за понимание. Я не думал о регулярном выражении. Я сообщил об этом: https://bugbase.adobe.com/index.cfm?event=bug&id=4164200 – Alex

+0

Добро пожаловать. Я полагаю, что гибкость не обязательно плохая вещь, но ... даже если это было их целью, они должны хотя бы упомянуть о поведении в документации ;-) – Leigh

Смежные вопросы