Syntax 阿克在这里干什么?我做错了什么?

Syntax 阿克在这里干什么?我做错了什么?,syntax,autohotkey,Syntax,Autohotkey,我试图制作一个脚本,定期读取不同坐标的像素,并根据给定文件out.txt将它们与给定的十六进制颜色进行比较。格式为x线y线颜色 Loop { if (GetKeyState("Space")) { Loop, Read, out.txt { tgt := StrSplit(%A_LoopReadLine%,%A_Space%) PixelGetColor hue, tgt[0],

我试图制作一个脚本,定期读取不同坐标的像素,并根据给定文件
out.txt
将它们与给定的十六进制颜色进行比较。格式为
x线y线颜色

Loop
{
    if (GetKeyState("Space"))
    {
        Loop, Read, out.txt
        {
            tgt := StrSplit(%A_LoopReadLine%,%A_Space%)
            PixelGetColor hue, tgt[0], tgt[1]
            if (%hue% != tgt[2])
            {
                Click tgt[0], tgt[1]
            }
        }
    }
        Sleep 10
}
产生此错误,屏幕截图,因为您无法选择文本:


它说变量名包含非法字符,后跟文件中应该是的一行,我试图将该值赋给数组,所以我不确定我做错了什么。我检查了所有相关部分中的ahk语法,没有任何内容突然出现在我的脑海中。看起来只是设置了一个变量。我在这里找不到错误。

您基本上只是对不推荐的旧语法和现代表达式语法感到困惑。
通过将变量包装在
%
中引用变量,这是您在legacy AHK中所做的操作。
然而,这是一种遗产,基本上不应该再这样做了。
在表达式中,只需键入变量名称即可引用变量

如果您使用的是传统语句(基本上只是命令中的参数),则可以切换到表达式语法,方法是先使用单个
%
参数,然后使用空格。您将看到下面的示例

我将逐行修复您的代码,记录更改:

在这里,我强制AHK解释filename参数上的表达式,只是为了显式指定一个带有
”的字符串
这是没有必要的,在实践中也没有什么不同,但如果你问我,它看起来好多了。特别是如果我们有一个更长更复杂的字符串。无需转义某些字符等
循环,读取,%%“out.txt”

这里我删除了
%
s,因为我们在参数中。
函数不是传统的AHK,它们使用现代表达式语法,因此我们只需键入变量名称即可引用变量。
tgt:=StrSplit(一条LoopReadLine,一个空格)

现在我们再次使用命令。默认情况下,所有命令在每个参数上都使用传统语法(除非文档中另有规定)。
实际上,它恰好是接受x和y参数表达式的命令之一,因此,实际上不需要通过使用
%
启动参数来强制此处的表达式。
但这并没有什么坏处,所以我只想让它更清楚,并让它显示出您通常使用命令所做的操作。
PixelGetColor,色调,%tgt[0],%tgt[1]

不使用旧语法,因此将删除
%%

if(色调!=tgt[2])

该命令不接受表达式,因此我们必须使用
%

强制该命令
单击%tgt[0],“tgt[1]

现在如果你注意到上面的内容,你应该想知道我为什么不这么做:
单击%tgt[0],%tgt[1]

这将是一个非常好的问题。如果它实际上是除
单击
命令之外的任何其他命令,您将完全执行该操作。
之所以不使用Click命令,是因为它很特殊(无论好坏)。它实际上没有不同的参数,它只有一个字符串参数。该参数包含所有必需的字、逗号和数字。
一个字符串参数是
tgt[0],“tgt[1]
创建的。它使用字符串逗号和空格连接这两个值


下面是完整的脚本:

Loop
{
    if (GetKeyState("Space"))
    {
        Loop, Read, % "out.txt"
        {
            tgt := StrSplit(A_LoopReadLine, A_Space)
            PixelGetColor, hue, % tgt[0], % tgt[1]
            if (hue != tgt[2])
            {
                Click, % tgt[0] ", " tgt[1]
            }
        }
    }
    Sleep, 10
}
要了解有关legacy vs expression的更多信息,这里有一个非常好的文档页面,可以帮助您开始: