Общий раздел по AutoIt > Баг-репорты и запросы на новые функции

Не работает _IniVirtual_Read

(1/1)

Vanguger:
Что-то не лады с UDF IniVirtual.au3. В примере, ключ почему-то захватывает перенос строки. Результат следующий:


--- Код: ---$sKey       = key2
$aKey[2][0] =
key2
---
$sKey       = 0x6B657932
$aKey[2][0] = 0x0A6B657932
$sKey = $aKey[2][0] ? False

--- Конец кода ---

Код: AutoIt #include <IniVirtual.au3>
$sPath = @ScriptDir & '\tmp.ini'
IniWrite ($sPath, "Section", "key1", "111" )
IniWrite ($sPath, "Section", "key2", "222" )
$s_ini_Text = FileRead($sPath)
$aInitVirtual = _IniVirtual_Initial($s_ini_Text)
$sRes = __IniVirtual_Read($aInitVirtual, 'Section', 'key2', 'Default')

Функция в UDF(с тестовыми строками)
Код: AutoIt Func _IniVirtual_Read($a_Ini_Virtual2D, $sSection, $sKey, $sDefault = '')
    Local $i = _ArraySearch($a_Ini_Virtual2D, $sSection, 1, 0, 0, 2, 1, 0)
    If @error Then Return $sDefault
    Local $aKey = $a_Ini_Virtual2D[$i][1]
;
ConsoleWrite('$sKey       = ' & $sKey & @CRLF)
ConsoleWrite('$aKey[2][0] = ' & $aKey[2][0] & @CRLF)
ConsoleWrite('---' & @CRLF)
ConsoleWrite('$sKey       = ' & StringToBinary($sKey) & @CRLF)
ConsoleWrite('$aKey[2][0] = ' & StringToBinary($aKey[2][0]) & @CRLF)
ConsoleWrite('$sKey = $aKey[2][0] ? ')
ConsoleWrite($sKey = $aKey[2][0])
ConsoleWrite(@CRLF&@CRLF)
;
    $i = _ArraySearch($aKey, $sKey, 1, 0, 0, 2, 1, 0)
    If @error Then Return $sDefault
    Return $aKey[$i][1]
EndFunc   ;==>_IniVirtual_Read

Vanguger:
По всей видимости дело в регулярке функции __IniVirtual_GetKeysVal

Код: AutoIt $vData = StringRegExp($vData, '(?m)^([^;].*?)\h*=\h*(["'']?)(.*?)\2\r?$', 3)

Не стал заморачиваться с регуляркой, всё заработало, когда немного изменил строку в функции:

Код: AutoIt $aData2D[$d][0] = StringStripWS($vData[$i], 1)

В итоге функция обрела следующий вид:
Код: AutoIt Func ___IniVirtual_GetKeysVal($vData)
    $vData = StringRegExp($vData, '(?m)^([^;].*?)\h*=\h*(["'']?)(.*?)\2\r?$', 3) ; учитывает пробелы между элементами и обрамление кавычками
    Local $d, $u = UBound($vData) ; 0 как индикатор ошибки
    Local $aData2D[$u / 3 + 1][2] = [[$u / 3]]
    For $i = 0 To $u - 1 Step 3
        $d = Int($i / 3) + 1
        $aData2D[$d][0] = StringStripWS($vData[$i], 1)
        $aData2D[$d][1] = $vData[$i + 2]
    Next
    Return $aData2D
EndFunc   ;==>__IniVirtual_GetKeysVal

AZJIO:
Версия AutoIt3 должна быть 3.3.8.1

Vanguger:
Понятно, спасибо! А я то самую свежую себе воткнул  :think:

AZJIO:
Vanguger
Можно поставить две версии. Вторую извлечь из моей сборки но как из архива, а не как инсталятор, чтобы не прописалась в реестр. Там же редактор Notepad++ с инструментами и видит свою среду, то есть по F5 выполнит скрипт и т.д. Будет как портабельная изолированная среда.

Навигация

[0] Главная страница сообщений

Перейти к полной версии