0

我在 Praat 脚本中创建了一个程序,如下所示:

procedure segment_allowed: .segment$
    appendInfoLine: "The argument I got was: ", .segment$
    .yes = 0
    for i from 1 to allowed_segments_size
        if allowed_segments$[i] = .segment$
            .yes = 1
        endif
    endfor
endproc

它基本上是试图找出是否.segment$存在于全局数组allowed_segments$中。

调用时的函数如下:

call segment_allowed segment_label$

总是输出:

The argument I got was segment_label$

为什么函数/过程没有获取实际值并将变量视为字符串?

4

1 回答 1

1

您正在混合旧语法(“速记”)和新语法,这令人困惑。

当您编写 时call segment_allowed segment_label$,您使用的是“速记”,并且(不推荐使用的)语法样式变量不会自动插入。如果你想使用那种风格,你应该写

call segment_allowed 'segment_label$'

强制插值。

一个更好的方法是使用新语法(您在过程定义中使用的),它可以进行更明智的变量插值。使用这种新语法(大约从 5.4 版开始提供),您的过程调用应该是

@segment_allowed: segment_label$

这应该做你想做的事。

顺便说一句,将您当前的过程调用翻译成这种更容易理解的新语法,您调用的是

@segment_allowed: "segment_label$"

另请注意,from 1for 循环是多余的,因为这是默认设置。如果您感兴趣的只是知道该段是否存在,则可以在找到匹配项时中断循环,如下所示(我还更改了您的ifor .i,以保持整洁):

procedure segment_allowed: .segment$
    appendInfoLine: "The argument I got was: ", .segment$
    .yes = 0
    for .i to allowed_segments_size
        if allowed_segments$[.i] = .segment$
            .yes = 1
            .i += allowed_segments_size
        endif
    endfor
endproc
于 2015-08-18T01:12:47.363 回答