Что нового

Не работает _IniVirtual_Read

Webarion

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

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

Код:
#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(с тестовыми строками)
Код:
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
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
По всей видимости дело в регулярке функции __IniVirtual_GetKeysVal

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


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

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


В итоге функция обрела следующий вид:
Код:
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

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Версия AutoIt3 должна быть 3.3.8.1
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Понятно, спасибо! А я то самую свежую себе воткнул :scratch:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Vanguger
Можно поставить две версии. Вторую извлечь из моей сборки но как из архива, а не как инсталятор, чтобы не прописалась в реестр. Там же редактор Notepad++ с инструментами и видит свою среду, то есть по F5 выполнит скрипт и т.д. Будет как портабельная изолированная среда.
 
Верх