1 (изменено: Malcev, 2014-09-07 15:22:22)

Тема: AHK: Способ присваивания переменной

Допустим у меня есть куча текста, который мне надо засунуть в переменную.
Я знаю 2 способа, через "=" и через ":=".
Может есть какой-нибудь третий, который не будет обращать внимание на незакрытые кавычки и на знаки процента, а все воспринимать как текст.
Пока приходится создавать текстовый файл и его уже читать в переменную.

2

Re: AHK: Способ присваивания переменной

Через continuation section?


Text =
( %`
"Hello, world!( %abc% ) `n Привет )
)

MsgBox, %Text%

Но есть ограничение — строка в тексте не может начинаться с закрывающей скобки ), т.к. это воспринимается как конец секции.

3

Re: AHK: Способ присваивания переменной

Точно. Спасибо. А то я проглядел про эти опции continuation section..

4

Re: AHK: Способ присваивания переменной

В дополнение
Malcev В последних версиях AHK рекомендуется использовать ":=" а не "="

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

5

Re: AHK: Способ присваивания переменной

А где об этом написано?
Лично я привык присваивать числа и обнулять переменные через "="

a = 1
a = 

6

Re: AHK: Способ присваивания переменной

Не помню где, но я тоже читал что-то такое. Предполагалось, что знак = в будущих версиях станет использоваться только для операции сравнения.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Способ присваивания переменной

А как они собираются в таком случае обходиться без знака равенства?

1 := "kkk"
a = %1%   ; как заменить на := ?
msgbox % a

8 (изменено: Alectric, 2014-09-10 09:31:11)

Re: AHK: Способ присваивания переменной

Наверно заменят на массив начинающийся с "A_". Если речь о входных командах.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

9

Re: AHK: Способ присваивания переменной

Нехорошо будет со стороны разрабов вот так брать и заменять базовые функции.

10 (изменено: Irbis, 2014-09-10 19:01:43)

Re: AHK: Способ присваивания переменной

Такой способ, но тоже не айс.

1 := "kkk"
a := 1, a := %a%
MsgBox % a

11

Re: AHK: Способ присваивания переменной

знак = в будущих версиях станет использоваться только для операции сравнения

Кроме того, имя переменной не сможет состоять только из цифр.

Нехорошо будет со стороны разрабов

От неудачных решений нужно избавляться.

12

Re: AHK: Способ присваивания переменной

В данном случае '1','2' и т.д. - передаваемые скрипту параметры командной строки, использование которых таким образом началось с basic-версии АНК.

13

Re: AHK: Способ присваивания переменной

bWRmeA пишет:

имя переменной не сможет состоять только из цифр

В смысле? На данный момент может.

14

Re: AHK: Способ присваивания переменной

станет

не сможет

На данный момент может.

Оокей.

15

Re: AHK: Способ присваивания переменной

bWRmeA, пруфлинк?

16 (изменено: serzh82saratov, 2014-09-12 00:04:02)

Re: AHK: Способ присваивания переменной

ypppu, Malcev
Ммм... И в выражении тоже? Наверное всё таки нет:

1 := "kkk" 
MsgBox % 1
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Способ присваивания переменной

В хелпе написано:

Although a variable name may consist entirely of digits, this is generally used only for incoming command line parameters. Such numeric names cannot be used in expressions because they would be seen as numbers rather than variables.

18 (изменено: serzh82saratov, 2014-09-12 00:34:05)

Re: AHK: Способ присваивания переменной

Енто то понятно:

1 = Ка 
MsgBox %1%тит

но ведь так, не:

1 := "Ка" 
MsgBox % 1 . "тит"

так понимаю речь про ето.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19 (изменено: serzh82saratov, 2014-09-12 00:36:52)

Re: AHK: Способ присваивания переменной

То бишь в полной мере, всё же имена переменных не могут состоять только из цифр, при любых условиях.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK: Способ присваивания переменной

Gourmet, Nikvasko пишет:

Чтение содержимого переменных. Как есть два метода записи переменных, так же есть и два способа их чтения: традиционный и выражением. Традиционный предполагает, что переменная, значение которой вызывается, обрамляется знаками процента.

При чтении выражением знаки процента вокруг имени переменной отсутствуют, но зато буквальное содержание строки заключается в кавычки. На примерах чтение переменных выглядит так:

; Это традиционный метод чтения:
КопияПеременнойМоеЧисло = %МоеЧисло%
КопияПер1 = %Пер1%
MsgBox Значение Пер1 равно %Пер1%.
    ; Это современный метод:
КопияПеременнойМоеЧисло := МоеЧисло
КопияПер1 := Пер1
MsgBox % "Значение Пер1 равно" . Пер1 . "."

При современном методе, чтобы отличить его от традиционного, в строку MsgBox вставлен знак процента с пробелом. Это - необходимость, поскольку по умолчанию большинство команд подразумевают традиционный метод. Однако, некоторые параметры некоторых команд задокументированы как выражения: в этих случаях знак процента можно не ставить (а можно и ставить).

Да. Переменная, имя которой состоит из цифр, в выражениях воспринимается как число.

Правда, если выполнить следующий код, появится интересная ошибка:

1 = "Ка" 
MsgBox % %1% . "тит"

21

Re: AHK: Способ присваивания переменной

Кавычки как часть имени переменной недопустимы, стало быть. В общем, логично.

22

Re: AHK: Способ присваивания переменной

Вопрос по continuation section.
Как я понимаю, текст должен начинаться с начала строки, да?
То есть получается некоторая некрасивость в оформлении.

if a = 1
{
   b =
(
text
text
)
}

23

Re: AHK: Способ присваивания переменной

Нет, не должен. Есть опция LTrim.

24

Re: AHK: Способ присваивания переменной

LTrim может не подойти, если нужны в начале строки отступы.

if a = 1
{
   b =
(
text
 text
)
}

25

Re: AHK: Способ присваивания переменной

Каким же образом АНК должен отличать нужные вам отступы от ненужных?

26 (изменено: Malcev, 2014-09-17 11:35:43)

Re: AHK: Способ присваивания переменной

Ну например так: "LTrim 3" - тримим на 3 пробела.
Либо брать за Trim количество пробелов от открывающей скобки.

27

Re: AHK: Способ присваивания переменной

Ну, это предложение к разработчикам. Но вы и сами могли бы написать функцию, которая бы делала подобное.

28

Re: AHK: Способ присваивания переменной

Не представляю как.
Может поможете?

29

Re: AHK: Способ присваивания переменной

Перебрать текст построчно, удаляя опр. кол. символов с начала каждой строки. Или RegExReplace с соответствующим шаблоном.

30 (изменено: Malcev, 2014-09-17 13:39:29)

Re: AHK: Способ присваивания переменной

У меня получается некрасиво и как это все вынести в функцию чтобы пользоваться?
А как сделать чтобы функция сама считала количество пробелов перед открывающейся скобкой ума не приложу.

a = 
(
111s

1111s

)
Loop, Parse, a, `n, `r
{
   StringTrimLeft, a, A_LoopField, 3
   b .= a "`r`n"
}
StringTrimRight, b, b, 1
msgbox % b

31

Re: AHK: Способ присваивания переменной

Оказывается, пробелы с начала первой строки удаляются автоматически при помещении текста в переменную. Ну вот зачем они это сделали?

А функция могла бы быть такой, наверно. Указывается символ и количество.


Text =
(
    Однажды
        Дважды
            Трижды
)

Clipboard := UnIndent(Text, " ", 4)

UnIndent(Text, Char, Count)
{
    return RegExReplace(Text, "`am)^" Char "{" Count "}")
}

32 (изменено: Malcev, 2014-09-17 14:38:06)

Re: AHK: Способ присваивания переменной

Оказывается, пробелы с начала первой строки удаляются автоматически при помещении текста в переменную.

Есть идеи как с этим бороться?

33

Re: AHK: Способ присваивания переменной

Нету. Никак ведь даже не узнать, сколько там было пробелов, да и были ли вообще.

Конечно, можно сделать первую строку пустой. Тогда первая строка текста станет второй строкой секции продолжения, и отступ у неё сохранится.

34

Re: AHK: Способ присваивания переменной

У разработчика есть.

35 (изменено: Malcev, 2014-09-17 14:59:07)

Re: AHK: Способ присваивания переменной

Типа так?

AutoTrim, off
Text =
(
%A_Space%%A_Space%%A_Space%%A_Space%%A_Space%Однажды
        Дважды
            Трижды
)
msgbox % text

По-моему предложение YMP проще:

Text =
(

    Однажды
        Дважды
            Трижды
)
StringTrimLeft, text, text, 1
msgbox % text

36

Re: AHK: Способ присваивания переменной

Или так

Text := 
(
"    Однажды
        Дважды
            Трижды"
)
msgbox % text

37

Re: AHK: Способ присваивания переменной

Irbis

не будет обращать внимание на незакрытые кавычки

Не подходит под задачу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

38

Re: AHK: Способ присваивания переменной

Перенесено из этой темы.

mozers пишет:

В AHK я - новичок, и до сей поры не понимаю многих вещей, например, смысла применения = (использование которого в привычном виде, в AHK ограничено разными условностями и оговорками). Есть же беспроблемный := ну так зачем вы тут и там еще пишите = ?

39

Re: AHK: Способ присваивания переменной

Болезненный переход с js/vbs? Более чем знакомо.

mozers пишет:

Есть же беспроблемный := ну так зачем вы тут и там еще пишите = ?.

Смотри:

A = B
MsgBOx % A

A := B
MsgBOx % A

A .= B
MsgBOx % A

A := "B"
MsgBOx % A

A .= "B"
MsgBOx % A

Или, допустим:

A = 5
MsgBox % A := 5 ? "A = 5" : "A ≠ 5"
MsgBox % A  = 5 ? "A = 5" : "A ≠ 5"

40

Re: AHK: Способ присваивания переменной

Например такой код трудновато записать через ":= ".

Var =
(
Line 1 of the text.
Line 2 of the text. By default, a linefeed (`n) is present between lines.
)

41

Re: AHK: Способ присваивания переменной

2Flasher
Да, да. Я как раз про эти "чудеса" и говорил. Чересчур много думать надо перед тем как = ставить.

2ypppu
Для меня понятней (а значит и надежней) было бы так:

Var := "Line 1 of the text.`n"
Var .= "Line 2 of the text. By default, a linefeed (`n"
Var .= ") is present between lines."

Хотя, может быть потом, когда я все пойму, буду использовать и =.
Но сейчас, для себя и для всех новичков, я бы очень не советовал его употреблять, во избежании неприятных неожиданностей, которые наглядно продемонстрировал Flasher.

42

Re: AHK: Способ присваивания переменной

Flasher пишет:

mozers
Похоже, ты не понял. Я как раз продемонстрировал ситуации, где := не годится. Когда присвоение текста идёт без кавычек (т.е. воспринимается не как переменная) и в момент сравнения (2-й код).

43

Re: AHK: Способ присваивания переменной

Присваивать через = удобней когда в исходном тексте есть много кавычек, чтобы не считать их и удваивать:

var = correspondents={"to":"","cc":"","bcc":""}

44

Re: AHK: Способ присваивания переменной

stealzy, это когда 2 строки, то легко проставить переносы. А когда целая портянка - уже тяжело. = позволяет большой кусок текста загнать в переменную, оставляя код удобочитаемым. Помнится, там ещё какая-то фишка была со ссылкой на переменные, что при использовании := сильно неудобно.

45

Re: AHK: Способ присваивания переменной

stealzy пишет:

Точно также можно сказать, что при вашем способе нельзя записать одиночную закрывающую скобочку в строке.

Это да, но есть противоядие - знак акцента.

stealzy пишет:

Сам всегда пишу := ).

В каком смысле, что скобка означает?

46

Re: AHK: Способ присваивания переменной

Вот отыскал пример кода. Попробуйте сделать то же самое, но вместо = используйте только :=.

+ открыть спойлер
#Persistent
Title = Новая песня
song = "Комбат"
singer = группа Любэ
author = Игорь Матвиенко
date = 1996 год
time = 05:30
comment =
(
Строка 1
Строка 2
Строка 3
)


Text =
(
Исполнитель %singer%
Название %song%
Автор %author%
%date%
Продолжительность %time%
Комментарии:
%comment%
)

TrayTip, %Title%, %Text%, 5, 16
Return

47 (изменено: stealzy, 2017-03-26 11:51:39)

Re: AHK: Способ присваивания переменной

Я считаю, что так гораздо симпатичнее (ИМХО):

Text := "Исполнитель " singer
. "`nНазвание " song
. "`nАвтор " author
. "`n" date
. "`nПродолжительность" time
. "`nКомментарии:`n" comment

Во-вторых, попробуйте-ка сделать %MyObject.property% или %fn()%. Будете временные переменные вводить на каждый чих?
О вкусах не спорят, конечно.

48 (изменено: ypppu, 2017-03-26 13:06:52)

Re: AHK: Способ присваивания переменной

По-моему не симпатичнее.
А имя песни как присваивать?

 song := """Комбат"""

тоже не симпатично. И комментарий уже на так наглядно смотрится:

comment :=
(
"Строка 1
Строка 2
Строка 3"
)

49

Re: AHK: Способ присваивания переменной

ypppu, ну никто же не будет присваивать название песни и комментарии из констант, захардкоженных в коде.
Код достает эти данные извне и присваивает в переменную.
Ну а если бы у меня были простыни текста в коде, я бы счел разумным разделить код и данные, и вынести текст в отдельный файл.

50

Re: AHK: Способ присваивания переменной

mozers пишет:

Flasher

Похоже, ты не понял. Я как раз продемонстрировал ситуации, где := не годится.

Я как раз понял. Ты продемонстрировал типичные "грабли", на которые может натолкнуться новичок. Разве твой код НИКАК НЕЛЬЗЯ записать БЕЗ = ? (ну чтобы результат получился таким же).


All
Никто не спорит с тем что применение = может иногда ужать код и сделать его более понятным для профессионалов.
А для новичков, я бы очень хотел добавить в давно не обновлявшийся FAQ:

Оператор присвоения, в других языках программирования выглядящий как = , в AutoHotkey записывается как :=.
Оператор = так же существует, но его использование ограничено рядом правил и условностей. Крайне не рекомендуется использовать в своих скриптах оператор = до тщательного изучения особенностей работы с ним. Тем более что не существует случаев когда без применения оператора = нельзя обойтись.

Нет возражений?

51

Re: AHK: Способ присваивания переменной

Песня - это частный случай. Может и слово в кавычках потребоваться сохранить как текст в коде. И многие как раз-таки стараются избавиться от дополнительных файлов. А быстро отредактировать страницу текста, содержащего спецсимволы, не получится.
Просто как пример приведу. У меня была программка, которая выдавала окно "Помощь" с описанием программы, перечислением горячих клавиш и т. п. Когда мне потребовалось отредактировать текст, я сделал это быстро и легко, без расстановки спецсимволов.

В общем это всё связано с удобством. А почему смущает само по себе присваивание строки при помощи "="? Надо просто помнить
:= присваивает только числовое значение, а = и :=" " присваивают строку.

52

Re: AHK: Способ присваивания переменной

stealzy пишет:

ypppu, меня смущает что в выражениях = ведет себя как оператор сравнения. Для одназначного поведения я использую его только для этой цели. Также мне не нравятся %переменные%. Опять же вопрос вкуса, спорить не о чем.

53

Re: AHK: Способ присваивания переменной

И все таки существует ли такой случай, когда без применения оператора = просто нельзя обойтись? Думаю, что - нет.
Так и получается что = - это роскошь для профессионалов и "грабли" для новичков.

54

Re: AHK: Способ присваивания переменной

mozers пишет:

Разве твой код НИКАК НЕЛЬЗЯ записать БЕЗ = ? (ну чтобы результат получился таким же).

Второй со сравнением? Нет. := не используется для сравнения.

55

Re: AHK: Способ присваивания переменной

mozers пишет:

А для новичков, я бы очень хотел добавить в давно не обновлявшийся FAQ

Добавляй.

56

Re: AHK: Способ присваивания переменной

ypppu, добавил.

Flasher, мы говорим исключительно об операторе присвоения. Оператор сравнения = вопросов не вызывает.

57

Re: AHK: Способ присваивания переменной

mozers пишет:

И все таки существует ли такой случай, когда без применения оператора = просто нельзя обойтись?

Как вы красиво замените такой код?

1 := "kkk"
a = %1%   ; как заменить на := ?
msgbox % a

58

Re: AHK: Способ присваивания переменной

mozers пишет:

Крайне не рекомендуется использовать в своих скриптах оператор = до тщательного изучения особенностей работы с ним.

Всё же стоило бы указать, что = используется, как оператор сравнения, во избежание путаницы.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

59 (изменено: teadrinker, 2017-03-26 19:01:46)

Re: AHK: Способ присваивания переменной

Malcev, это единственный пример, где оператор = необходим для присвоения, если имеется в виду параметр — издержки синтаксиса.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

60

Re: AHK: Способ присваивания переменной

teadrinker, это понятно.
Может стоит дополнить фак таким примером?

61

Re: AHK: Способ присваивания переменной

По идее надо бы, но тогда придётся разъяснять, что такое параметры — тема-то для новичков.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

62

Re: AHK: Способ присваивания переменной

Malcev teadrinker
Замечания учел. В посте добавил слово "почти".

Тем более что почти не существует случаев когда без применения оператора = нельзя обойтись.

63

Re: AHK: Способ присваивания переменной

Malcev скорее лучше написать, что не рекомендуется использовать числа как имена переменных.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

64

Re: AHK: Способ присваивания переменной

Ну тут речь идет о параметрах переданных скрипту через коммандную строку.

65

Re: AHK: Способ присваивания переменной

Утверждение, что речь идет именно о параметрах переданных скрипту через коммандную строку, я пропустил.

Если про них, то да это упущение, надо бы что то вроде A_ComParam1.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

66

Re: AHK: Способ присваивания переменной

Поскольку способ описания истины есть точка соприкосновения для всех нас, таких, во многом не одинаковых, а ораторами-ориентирами на этой площадке выступают умудрённые знанием мужи, то само по себе - прекрасно, когда, постигая мудрость сию, однажды приходишь ко мнению, что все мы говорим на одном и том же языке стирающем в этой неодинаковости нашу семантическую пропасть. Хотя бы в скромных рамках "Серого форума". И чем меньше будет оставаться шаблонов, имеющих так мало важности в общей концепции, но отнимающих столько внимания, что их требуется обсуждать, тем больше даров светлых мыслей оставят нажатые клавиши наших клавиатур.
Хорошо, когда правила одинаковы для всех. Когда краткий смысл закладываемый в имена переменных приводит к ассоциациям своего назначения, а цифры выполняют свою счислительную роль. Пожалуй, в своей практичности - это на столько же хорошо, как предложения, начинающиеся с заглавной буквы и заканчивающиеся точкой. Становится сразу видно, что человек выражающий свою мысль пишет не себе самому, а старается быть понятным, оперируя в повести этой мысли базовыми принципами, одинаково правильно воспринимаемыми для любого читателя, успевшего с ними ознакомиться. В этой связи, думается, что такой фундаментально важный "кирпичик" как знак присваивания, не должен заниматься булевыми операциями, как было бы неправильно пользовать наждачную бумагу в роли туалетной. И хотя такая возможность представлена в AHK, различие функциональных особенностей сравнения и присваивания порой может поставить в тупик, словно фраза - "Сравнить нельзя присвоить".
Вероятно, если где-то в синтаксисе есть положения, при которых "=" – это must have, то стоит акцентировать внимание именно на этих местах и там и использовать. В остальных же, всё должно быть по "Феншуй" и не оставлять после себя ощущения неверного толкования очевидных вещей. В этом настолько же мало пользы, как в ощущении, которое бы последовало, если воспользоваться наждачкой в описанном чуть выше применении.
Сам после "Решётки" по инерции всегда сравниваю так - "==". Если чувствительность к регистру настраивается в "StringCaseSense", то в подобных вольностях мне видятся все следующие за ними разнозначительные трактовки и раз уж принято за правило писать оператор присваивания так - ":=", то эту запись - "=", воспринимаемую двояко, не использую вообще. Конечно, я может так же ещё и амбициями не дорос до тех случаев, где по-другому никак, но скорее всего, когда это время наступит, я буду старательно избегать использования такого способа. Одно только представление того, как по моим "батонам" хрустит абразив, убивает саму идею о правильном поведении.