Операции для символьных данных в Visual FoxPro
« Назад С символьными данными применяются операции: "+", "–" и "$", а также операции отношения. Операция "+" выполняет объединение (конкатенацию) двух строк, например: result = str1 + str2 Операндами такого выражения могут быть константы, переменные и поля таблиц, имеющие тип Character или Memo, например: str1 = "Объединение" + ", или " + "конкатенация" resultStr = str1 + ' двух строк' Операция "–", так же как и операция "+", применяется для объединения значений двух строк. Однако при использовании "–" завершающие пробелы первого операнда удаляются, например: str1 = '123 ' && В конце строки 5 пробелов ? str1 – '45' && Напечатает: 12345 ? str1 + '45' && Напечатает: 123 45 Результатом выполнения операции "$" будет .T., если первый символьный операнд имеется во втором, или .F. – в противном случае, например: ? "123" $ "12345" && Напечатает: .T. ? "134" $ "12345" && Напечатает: .F. Замечание. Операция "$" чувствительна к регистру и рашмор-неоптимизируема. В выражении с символьными операндами наивысший приоритет имеет операция "+", наименьший – операция "$", например: str1 = '123 ' && В конце строки 5 пробелов ? '234' $ str1 – '45' && Напечатает: .T. ? '234' $ str1 + '45' && Напечатает: . F. Вместо операции "$" можно применить встроенную функцию OCCURS( ), возвращающую число вхождений первого своего параметра во второй. Параметры функции должны иметь символьный тип. Например: str1 = '123 ' && В конце строки 5 пробелов ? Occurs('234', str1 – '45') && Напечатает: 1 ? Occurs('234', str1 + '45') && Напечатает: 0 ? Occurs('AB', 'abABabAB') && Напечатает: 2 Полную замену операции "$" обеспечивает совместное употребление функции OCCURS( ) и операции отношение ">", например: ? Occurs("123", "12345") > 0 && Напечатает: .T. С таким же успехом можно использовать встроенную функцию AT( ), возвращающую номер позиции вхождения своего первого символьного параметра во второй. При отсутствии вхождений функция вернет 0. например: ? At("234", "12345") && Напечатает: 2 ? At("237", "12345") && Напечатает: 0 ? At("234", "12345") > 0 && Напечатает: .T. В операции отношения строки сравниваются посимвольно. Так, ? 'ac' > 'abcd' напечатает .T., поскольку код символа "c" больше кода символа "b", а ? 'ab' > 'abcd' && Напечатает: .F. Важно помнить, что на результаты операции отношения влияет установка команды SET EXACT, например: set exact off ? 'abcd' = 'ab' && Напечатает: .T. ? 'abcd' > 'ab' && Напечатает: .F. Результат объясняется тем, что при установке SET EXACT в OFF в сравнении участвуют только 2 символа – по числу символов правого операнда. VFP увеличит размер короткой строки, добавляя к ней хвостовые пробелы, и станет сравнивать все символы операндов, если установить SET EXACT в ON, например: set exact on ? 'abcd' = 'ab' && Напечатает: .F. ? 'abcd' > 'ab' && Напечатает: .T. Исключение составляет операция "==", которая всегда работает, словно SET EXACT установлен в ON (пример см. в разд. 3.5.2 и 3.7.4) Взамен операции отношения "==" можно употребить встроенную функцию LIKE( ), например ? Like('abcd', 'ab') && Напечатает: .F. ? Like('abcd', 'abcd') && Напечатает: . T. Возможности функции LIKE( ), правда, несколько шире: в ее аргументы можно подставлять символы "*" и "?", используемые в общепринятом порядке, например: ? Like('ab*, 'abcd') && Напечатает: . T. ? Like('ab??, 'abcd') && Напечатает: . T. ? Like('ab?d, 'abcd') && Напечатает: . T. ? Like('ab*d, 'abcd') && Напечатает: . T. ? Like('ab?, 'abcd') && Напечатает: . F. |