Что нового

Задать значение переменной из условия другой переменной

liond66

Новичок
Сообщения
117
Репутация
2
Скрипт читает файл и при нахождении начала строки $Var должен присвоить переменной, записанной там, значение записанное там.
Известно начало имени переменной: $Var
Для простой проверки можно без файла. Пробую так:
Код:
Local $Var1, $Var2, $Var3
$FileLine = "$Var1 = 'aaaaaaa'"
Execute($FileLine)
msgbox(0,"Check Value", "Value=" & $Var1)

Значение переменной остаётся пустое.
Можно как-то вывернуться через Assign, но тогда приходиться всё время читать через Eval, что не удобно и не всегда возможно.
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Я заранее не знаю имя переменной для Assign.
И имя, и значение я получаю из строки.
Пробую так, и тоже не выходит:
Код:
Local $Var1
$FileLine = "$Var1 = 'aaaaaaa'"
Assign(StringLeft($FileLine, 6), StringRegExpReplace($FileLine, "(?s).*(\'.*?\').*", "\1")) ; для двухзначного числа
MsgBox(0, "Check Value", "Value=" & $Var1)


Или так:
Код:
Local $Var1
$FileLine = "$Var1 = 'aaaaaaa'"

$A = StringLeft($FileLine, 5)
$B = StringRegExpReplace($FileLine, "(?s).*(\'.*?\').*", "\1")
msgbox(0,"", $A & @CRLF & $B)
Assign("A", $B)
MsgBox(0, "Check Value", "Value=" & $Var1)
 
Последнее редактирование:

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Вы должны понимать что выражение это то что возвращает результат и понятия присваивания в нем нет. Оператор "=" в нем используется только для сравнения.
Код:
Global $Var1 = "aaaaaaa"
MsgBox(0, "Check Value", Execute("$Var1 = 'aaaaaaa'"))

Но вы можете использовать в нем все доступные функции. Даже Assign (как раз для присваивания) и обойтись без деления строки, а записывать значения в файле как параметры Assign. Или просто делить строку по символу "=" и использовать сразу Assign.
Код:
Global $Var1, $Var2, $Var3

Global $aLines[] = ['"Var1", "test1"', '"Var2", "test2"', '"Var3", "test3"']
For $i = 0 To UBound($aLines) - 1
    Execute(StringFormat("Assign(%s)", $aLines[$i]))
Next

MsgBox(0, "Check Value", "Var1=" & $Var1 & @CRLF & _
        "Var2=" & $Var2 & @CRLF & _
        "Var3=" & $Var3)


Я заранее не знаю имя переменной
Тогда как вы собираетесь к ней обращаться без Eval?
Сообщение автоматически объединено:

В Assign и Eval вы должны указывать имя переменной без $
 
Последнее редактирование:
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Я просто про Eval не точно понимаю.
Имена переменных известны. Скажем $Var1 до $Var15,
Некоторым переменным присваиваются значения из файла, если они там присутствуют.
Вот смог сделать решение, но оно работает или для 1-значных чисел в переменной, или для 2-х значных, но не вместе:
Код:
Local $Var12
$FileLine = "$Var12 = 'aaaaaaa'"
$A = StringTrimLeft(StringLeft($FileLine, 6), 1)
$B = StringRegExpReplace($FileLine, "(?s).*(\'.*?\').*", "\1")
Assign($A, $B)
msgbox(0,"Check Value", "Value=" & $Var12)
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
обойтись без деления строки, а записывать значения в файле как параметры Assign
Чем вам не подходит этот вариант? Или почему бы не использовать IniRead?

Или просто делить строку по символу "=" и использовать сразу Assign.
Вариант с делением
Код:
#include <StringConstants.au3>
Global $Var1, $Var2, $Var3

Global $sLines = '$Var1 = "test1"' & @CRLF & _
        '$Var2 = "test2"' & @CRLF & _
        '$Var3 = "test3"'

Global $aSplit = StringRegExp($sLines, "(?m)\$(\w+?)\h*=\h*(.*?)\h*$", $STR_REGEXPARRAYGLOBALMATCH)
For $i = 0 To UBound($aSplit) - 1 Step 2
    Execute(StringFormat("Assign('%s', %s)", $aSplit[$i], $aSplit[$i + 1]))
Next

MsgBox(0, "Check Value", "Var1=" & $Var1 & @CRLF & _
        "Var2=" & $Var2 & @CRLF & _
        "Var3=" & $Var3)
 
Последнее редактирование:
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Да, это хорошо. Но мне нужно для одной пары:
Код:
Global $sLines = '$Var1 = "test1"'
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Да, это хорошо. Но мне нужно для одной пары:
Код:
Global $sLines = '$Var1 = "test1"'
А в чем проблема? Это просто пример, вы можете использовать и одну строку.
Код:
#include <StringConstants.au3>
#include <Array.au3>
Global $Var1, $Var2, $Var3

Global $sLines = '$Var1 = "test1"'

Global $aSplit = StringRegExp($sLines, "(?m)\$(\w+?)\h*=\h*(.*?)\h*$", $STR_REGEXPARRAYGLOBALMATCH)
For $i = 0 To UBound($aSplit) - 1 Step 2
    Execute(StringFormat("Assign('%s', %s)", $aSplit[$i], $aSplit[$i + 1]))
Next

MsgBox(0, "Check Value", "Var1=" & $Var1 & @CRLF & _
        "Var2=" & $Var2 & @CRLF & _
        "Var3=" & $Var3)

Только вы раньше указывали что эти данные будут считываться из файла и переменных 15 штук. Мне казалось логичным что вы захотите прочитать весь файл сразу и присвоить значения переменным поэтому я делал пример сразу для нескольких строк.

Очень плохо что вы не отвечаете на мои предыдущие вопросы.
 
Последнее редактирование:
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Прошу прощения, если был не точным. Загрузила меня эта проблема :blush:
Файл не INI и содержит также другие данные.
Я буду делать перебор строк на присутствие $var в начале строки.
Но Вы меня как-то натолкнули на решение и это получилось.
Спасибо ещё раз за помощь. Вот моё решение. Меняя $FileLine = "$Var12 на $Var1 проверяем решение
Код:
Local $Var1, $Var12
$FileLine = "$Var12 = 'aaaaaaa'"

If StringInStr($FileLine, "=") = 7 Then
    $A = StringTrimLeft(StringLeft($FileLine, 5), 1)
ElseIf StringInStr($FileLine, "=") = 8 Then
    $A = StringTrimLeft(StringLeft($FileLine, 6), 1)
EndIf

$B = StringRegExpReplace($FileLine, "(?s).*(\'.*?\').*", "\1")
Assign($A, $B)
msgbox(0,"Check Value", "$Var1" & $Var1 & @CRLF & "$Var12" & $Var12)
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Довольно ненадежное решение. Вы можете прочитать файл полностью и с помощью регуральных выражений взять нужные значения.

Выбор всех $var*
Код:
#include <StringConstants.au3>
Global $Var1, $Var2, $Var3

Global $sLines = '$Var1 = "test1"' & @CRLF & _
        "блаблабла" & @CRLF & _
        "блаблабла" & @CRLF & _
        "блаблабла" & @CRLF & _
        "блаблабла" & @CRLF & _
        "блаблабла" & @CRLF & _
        '$Var3 = "test3"' & @CRLF & _
        "блаблабла" & @CRLF & _
        "блаблабла" & @CRLF & _
        "блаблабла" & @CRLF & _
        "блаблабла" & @CRLF & _
        "блаблабла" & @CRLF & _
        "блаблабла" & @CRLF & _
        '$Var2 = "test2"'

Global $aSplit = StringRegExp($sLines, "(?im)\$(var\d+?)\h*=\h*(.*?)\h*$", $STR_REGEXPARRAYGLOBALMATCH)
For $i = 0 To UBound($aSplit) - 1 Step 2
    Execute(StringFormat("Assign('%s', %s)", $aSplit[$i], $aSplit[$i + 1]))
Next

MsgBox(0, "Check Value", "Var1=" & $Var1 & @CRLF & _
        "Var2=" & $Var2 & @CRLF & _
        "Var3=" & $Var3)


Если же вы читаете файл построчно, вы все равно можете использовать регулярные выражения для каждой подстроки.
 
Последнее редактирование:
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Переменные, это вообщем то массив с пустым значением: Dim $Var[15]. Или [50].
Файл для считывания - это код AutoIt.
Только некоторые переменные присутствуют в файле.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Вы можете предоставить пример скрипта в котором храняться нужные переменные и пример того в каком виде вы хотите получать доступ к ним в другом скрипте? Это данные постоянны или вы редактируете этот скрипт?

И главный вопрос, в чем смысл использования такого костыля, как вы дошли именно к такому способу хранения данных? Возможно вам стоит подумать над более удобным способом?
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Данные храняться в перемешку с другими строками, но в таком виде:
Код:
$Var[1] = 'aaaaaaa'
$Var[2] = 'bbbbbbb'
$Var[3] = 'ccccccccc'
$Var[1] = ''

Мне нужно считать значения в память основного скрипта для дальнейшего использования,
как будто я задал их из основного скрипта.
Моё решение почему-то не хочет работать с переменной массива.
Я буду рад если Вы предложите точное решение.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Скрипт читает файл и при нахождении начала строки $Var должен присвоить переменной, записанной там, значение записанное там.
Известно начало имени переменной: $Var
Для простой проверки можно без файла. Пробую так:
Код:
Local $Var1, $Var2, $Var3
$FileLine = "$Var1 = 'aaaaaaa'"
Execute($FileLine)
msgbox(0,"Check Value", "Value=" & $Var1)

Значение переменной остаётся пустое.
Можно как-то вывернуться через Assign, но тогда приходиться всё время читать через Eval, что не удобно и не всегда возможно.
Код:
$FileLine = "$Var1 = aaaaaaa bb"

$FileLine = StringRegExp($FileLine, '\$([\w]*)\h*=\h*(.*)', 3)
If UBound($FileLine) = 2 Then Assign($FileLine[0],$FileLine[1])

MsgBox(0,"Check Value", "Value=" & $Var1)
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
$Var[1] = 'aaaaaaa'
$Var[2] = 'bbbbbbb'
$Var[3] = 'ccccccccc'
$Var[1] = ''
С помощью Assign вы не можете происвоить значение элементу массива. После чтения скрипта вы получите в качестве имени Var[1], поэтому я спрашивал в каком виде вы хотите получать доступ к данным. Можно убирать скобки и создавать переменные по типу Var1.

Если эти данные известны с самого начала, вы можете создать отдельный скрипт в котором будет ваш массив и подключать его куда нужно с помощью #include
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
IMStrelcov, спасибо за попытку.
Как я выяснил к переменной типа массив нужно другое решение. Мне сейчас нужно решить:
Код:
Local $Var[15]
$FileLine = "$Var[1] = 'aaaaaaa bb'"
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Пробовал решить на простом примере, поэтому не использовал массив.
И не предполагал, что с массивом решение будет другое.
И пытался использовать Execute, а Assign уже появился позже, в результате нашей беседы.
Пользователь открывает разные файлы в процессе работы, поэтому через #include не получиться,
или я до конца не понимаю.
Число переменных может со временем поменяться, поэтому использую массив.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
IMStrelcov, спасибо за попытку.
Как я выяснил к переменной типа массив нужно другое решение. Мне сейчас нужно решить:
Код:
Local $Var[15]
$FileLine = "$Var[1] = 'aaaaaaa bb'"
Код:
Global $Var5[15]
$VarName = 'Var5';это чтобы выражение не взяло значение для другой переменной прописанной в фашем файле конфиге
$FileLine = "$Var5[10] = aaaaaaa bb"

MsgBox(0,"Check Value", "Value=" & $Var5[10])

$FileLine = StringRegExp($FileLine, '\$'&$VarName&'\[([0-9]*)\]\h*=\h*(.*)', 3)
If UBound($FileLine) = 2 Then
   $Var5[$FileLine[0]] = $FileLine[1]
EndIf

MsgBox(0,"Check Value", "Value=" & $Var5[10])
 
Последнее редактирование:

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Пользователь открывает разные файлы в процессе работы, поэтому через #include не получиться,
или я до конца не понимаю.
Верно.

Пробовал решить на простом примере, поэтому не использовал массив.
И не предполагал, что с массивом решение будет другое.
И пытался использовать Execute, а Assign уже появился позже, в результате нашей беседы.
Число переменных может со временем поменяться, поэтому использую массив.
Если речь зашла о пользователях, а не личном использовании, тогда решение с использованием переменных из скриптов выглядит очень странно.
Наверное качественно решить вашу проблему будет возможно только если вы опишите функционал скрипта и что представляют данные из других скриптов.

Но если вам не подходит такой вариант, вы можете углубляться в использование костылей.
Код:
#include <StringConstants.au3>
#include <Array.au3>
Global $Var[15]

Global $sLines = "$Var[1] = 'test1'" & @CRLF & _
        ";блаблабла" & @CRLF & _
        '$Var[2] = "test2"' & @CRLF & _
        ";блаблабла" & @CRLF & _
        '$Var[3] = "test3"'

Global $aSplit = StringRegExp($sLines, "(?im)(\$Var[[]\d]+?)\h*=\h*(.*?)\h*$", $STR_REGEXPARRAYGLOBALMATCH)
For $i = 0 To UBound($aSplit) - 1 Step 2
    Execute(StringFormat("_Assign(%s, %s)", $aSplit[$i], $aSplit[$i + 1]))
Next
_ArrayDisplay($Var)

Func _Assign(ByRef $vVar, $vValue)
    $vVar = $vValue
EndFunc   ;==>_Assign
 
Последнее редактирование:
Верх