Praat脚本编程中文教程:认识数值变量与字符串变量

分类:Praat
 标签:Praat脚本,Praat中文教程,Praat编程
   修改 | 阅读(1934)| 评论(0)



什么是变量?我们来看一下百度百科的解释:

变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的;但在纯函数式语言(如Haskell)中,变量可能是不可变(immutable)的。在一些语言中,变量可能被明确为是能表示可变状态、具有存储空间的抽象(如在Java和Visual Basic中);但另外一些语言可能使用其它概念(如C的对象)来指称这种抽象,而不严格地定义“变量”的准确外延。

看了之后是不是还不知道到底什么是变量?我个人试着用“人话”来说明一下:比如说一个人的名字,真实名字叫“程旭园”,第二个人叫他“小程”,第三个人叫他“阿旭”。那在这里,这个人就是我们所说的变量,变量可以根据不同情况进行赋值,例子中我们可以认为首先我们给这个人赋值为“程旭园”,第二次赋值为“小程”,第三次赋值为“阿旭”,也就是说这个人的名字是可变的,这就是变量。我试图用例子解释什么是变量,但这个例子并不是十分恰当,因为在程序编写过程中,变量有作用域与生存周期等等,这里不详细叙述,如果你想学习,那请找专门的编程语言进行学习,而不是只学习这里的Praat脚本。

在这些严格的编程语言中,变量是要进行定义及指定变量类型的,但在Praat中,我们不必要那么麻烦,直接给一个变量赋值,就算是定义了一个变量了,变量的命名规则一般是字母开头,后面可跟上数字或下划线,比如:

n=1234
n1=5678
n_a=9
n_b=0

例子中第一行我们给变量“n”进行了赋值,当然你也可以用其他的名字(比如:n1、num、abc等等),随你喜欢,只要符合变量的命名规则都可以。让它的值为“1234”。当我们的脚本读到这句的时候,就相当于是说“n的值是1234”,在后续的脚本中如果我们用到“n”时,我们就知道这是“1234”。那我们可以用上一节说到的writeInfoLine来输出“n”看看。

n=1234
writeInfoLine:n

运行此脚本后,我们看到输出窗口中的输出内容为

1234

这里我们注意了,writeInfoLine:后面的"n"千万不要用引号引起来,否则就直接输出字母“n”。

既然是变量,就是说它是可变的,下面的例子我们来看一下它是如何变的:

n=1234
writeInfoLine:n
n=5678
appendInfoLine:n

输出结果为:

1234
5678

同样为输出n,第一次输出的是“1234”,第二次输出的却是“5678”,说明变量的值发生了变化。我们来解释一下这4行脚本:

第一行:将n赋值为1234这很容易理解。

第二行:上节教程说到的,清除输出窗口内容并输出,这里我们把n变量的值输出,也就是我们看到的1234。

第三行:将n赋值为5678,这里可能有人就懵了,同样是n,那你又让它等于1234,又让它等于5678,那它到底是多少?在计算机中,每一个变量都是对应着一个内存地址,我们访问这个变量就相当于访问该内存地址,当我们第二次为这个变量赋值,那它第一次的值就会被覆盖,在生命周期内同一作用域下访问该变量都是访问最初分配的内存地址,超出了其生命周期或作用域下,才会重新分配内存地址。(说什么啊?好晕!我想静静。。。),不理解就算了,反正你知道n之前等于1234,后来被5678覆盖了就行了。

第四行:输出n的值,在第三行中它的值已经变成了5678,所以在这里输出的就是5678。

这里再补充一下上一节中没提到的writeInfoLine、appendInfoLine的用法,如果我们使用变量,那我们可以在各输出内容间用英文逗号“,”隔开,在输出时就会连成一行进行输出。

所以,以上的程序我们可以加上相关的说明使得输出内容看起来更和谐:

n=1234
writeInfoLine:"n的值为:",n
n=5678
appendInfoLine:"n的值变为:",n

输出结果为:

n的值为:1234
n的值变为:5678


变量不仅仅可以存储值,还能进行运算。看以下程序:

n1=2
n2=n1*3
n3=4+5
n1=n3
writeInfoLine:"n1的值为:",n1
appendInfoLine:"n2的值为:",n2
appendInfoLine:"n3的值为:",n3

输出结果为:

n1的值为:9
n2的值为:6
n3的值为:9

我们来解释一下:

第一行:将2赋值给n1

第二行:将n1乘于3再赋值给n2,这里有个问题,这个等号在前面,乘号在后面,为什么不是先将n1赋值给n2再乘于3呢,这涉及到一个优先级的问题,运算符(+-*/)的优先级高于赋值符(=),运算符的优先级遵循四则运算规律。所以是先计算“n1*3”再赋值给n2。

第三行:将4+5后的值赋值给n3,也就是把9赋值给n3。

第四行:将n3的值赋给n1,变量可以从变量赋值。上一行中n3等于9,所以这行是把9赋值给n1,所以我们看到的输出结果就如上面所示。


以上篇幅所叙述的都是数值变量,下面的部分将介绍字符串变量


跟数值变量一样,字符串变量可以用于存储内容,但这里存储的内容为字符,而不是数字。在Praat中,字符串变量后面用一个美元符号($)表示。我们再来写一下我们的“Hello World”程序:

text1$="Hello"
text2$="World"
writeInfoLine:text1$+" "+text2$

很明显,输出的结果为:

Hello World

这里要说明一下的就是这个加号(+),在数值变量中用+号连接,是把两个数值做加法运算,在字符串变量中,是把两个字符串连接起来。

我们再来看如下例子说明:

a=1
b=2
c$="1"
d$="2"
writeInfoLine:a+b
appendInfoLine:c$+d$

输出的结果为:

3
12

正如我们上面所说,a和b是数值型变量,用加号连接是做加法运算,所以第一行输出结果是“3”,而c和d是字符串变量,加号是将其连接起来,所以在1后面直接连上2,也就是我们看到的第二行输出“12”。

注:两个不同类型的变量是不能用加号(+)连接的!

如上面的脚本我们输出时这样写:

writeInfoLine:a+c$

这个是运行不过的,脚本会报错。如果想把数值变量和字符串变量一起输出,我们可以用英文状态下的逗号(,)来实现,如:

writeInfoLine:a,c$

输出结果为:

 11

因为我们说过,writeInfoLine后面的逗号是用来连接输出用的。


不管你有没有看明白,这一节的教程就到这里结束了,上文中列举的脚本程序你可以自己运行试试,如果你从网页上复制的脚本放到脚本窗口执行时出错的话建议您在脚本窗口手动敲代码,因为复制的可能会有一些我们看不到的字符一起被复制了,我们看不到,但执行的时候会出错。




原创作品,未经授权不可进行转载。





您的昵称:*
QQ登录(无需注册直接登录可进行回复)
您的邮箱:(填写邮箱,如有回复可进行邮件通知)
验证码:
点击刷新