TearStr

From SunFlurry wiki
Revision as of 08:54, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  TearStr (Функции работы со строками)
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку
Визуальность:Нет

Функция производит деление исходного строкового представления на две строки, разделенные вторым аргументом, возвращая в результате первую подстроку, и обновляя значение переменной первого аргумента второй строкой, если первый аргумент был переменной. Функция оптимизирована для работы с длинными строками, новое резервирование в памяти строки первого аргумента после выполнения функции не происходит. Функция может использоваться для разбора строк в различных ситуациях, от форматированного XML или JSON, до прохода по тексту, разделенному знаками переноса строк. Для практического понимания, функция является последовательностью из функций Pos, Left и Mid, работающих на системном уровне.

Функции TearStr и GetSubStr имеют сходное предназначение и используются, как универсальные средства для разбора строк. Однако использование GetSubStr заставляет создавать дополнительную переменную, что усложняет текст программы. Тем не менее, плюсом GetSubStr явлется то, что исходная строка не будет изменена, потенциально, отменяя необходимость дублирования исходной строки в дополнительной переменной, если есть необходимость сохранить ее начальное значение. Выбор той функции, которую выгоднее использовать в определенной ситуации, остается за программистом. Обе функции оптимизированы по скорости исполнения и для работы с большими строками. Ниже дан замер производительности для процессора i5 при сравнительно одинаковых условиях.

Randomize(1);
//Создание длинной строки, разделенной строками _NEWLINE
аСтр:="";
For i:=1 To 1000000 Do
  AppendStringToBufferedString(аСтр,Str(Random(1000000))+_NEWLINE);
EndDo;

//Для текущего алгоритма генерации псевдослучайных чисел, будет выведено 7888988
Message("Длина исходной строки: "+Length(аСтр));
//Аллоцируем все переменные заранее
i:=1;
j:=length(аСтр);


ProfilerClear();
ProfilerStart();
//Используется разбор длинной строки с помощью GetSubStr
While i<=j Do
  Стр2:=GetSubStr(аСтр,i,_NEWLINE);
EndDo;

//Используется разбор длинной строки с помощью TearStr
While аСтр<>"" Do
  Стр2:=TearStr(аСтр,_NEWLINE);
EndDo;
ProfilerStop();
DebugBreak;
Message("Done!");

Замер показывает, что строка Стр2:=TearStr(аСтр,_NEWLINE);, выполнявшаяся 1 млн. раз, заняла время в 2.2 сек, тогда как Стр2:=GetSubStr(бСтр,i,_NEWLINE); потратила 2.589 секунды времени. Это значит, что в данном примере функция GetSubStr выполнялась примерно на 17.7% медленнее.

Синтаксис

TearStr(<Строка>,<Подстрока-разделитель>="@"):<Результат (STRING)>

Аргументы

  • <Строка> - (возможен аргумент-переменная (ByRef)) Значение, над строковым представлением которого необходимо провести операцию. Обычно аргумент представляет собой переменную со строковым значением. Если аругмент не является переменной, операция будет выполнена, но начальное значение не будет обновлено.
  • <Подстрока-разделитель> - (необязательный аргумент) Значение, строковое представление которого используется, как разделитель. Разделитель и его части не будут отдаваться в результате. По умолчанию используется знак at (@).

Возвращаемое значение

Возвращает левую часть строки до разделителя, остаток строки после разделителя обновляет значение переменной первого аргумента. Результат может быть как ANSI строкой, так и UTF-16 строкой в зависимости от типа строки первого аргумента.

Примеры

аСтр:="Производится разбор этой строки";

//Будет выведено "Производится", аСтр содержит фразу "разбор этой строки"
Message(TearStr(аСтр," "));

//Будет выведено "разбор", аСтр содержит фразу "этой строки"
Message(TearStr(аСтр," "));

//Будет выведено "этой", аСтр содержит слово "строки"
Message(TearStr(аСтр," "));

//Будет выведено "строки", аСтр содержит пустую строку ""
Message(TearStr(аСтр," "));