编程语言通常有许多共同的特征。学习一门新语言的好方法是编写一个熟悉的程序。在本文中,我将使用Awk编写一个“数字猜测”程序来展示熟悉的概念。
当你学习一门新的编程语言时,你最好关注大多数编程语言的共同点:
变量 —— 存储信息的地方表达式 —— 计算的方法语句 —— 在程序中表示状态变化的方法
这些概念大多是编程语言的基础。
一旦你理解了这些概念,你就可以开始理解其他的了。例如,大多数语言都有其设计所支持的“处理方法”,这些方法可能因语言而异。这些方法包括模块化(将相关功能组合在一起)、声明性和命令性、面向对象、低级和高级语法特征等等。许多程序员都熟悉编程的“仪式”,即在处理问题之前设置场景所需的工作。据说Ja编程语言有一个源自其设计的重要仪式性要求,即所有代码都定义在一个类中。
但从根本上说,编程语言通常都有相似之处。一旦你掌握了一种编程语言,你就可以学习另一种语言的基础知识,并品尝这种新语言的不同之处。
一个好的方法是创建一套基本的测试程序。有了这些,我们就可以从这些相似点中学习。
您可以选择创建的一个测试程序是“猜测数字”程序。电脑从1到100中选择一个数字,让你猜。程序会一直循环,直到你猜对为止。
“猜测数字”程序实践了编程语言中的几个概念:
变量输入输出条件判断循环
这是学习新编程语言的一个很好的实践实验。
注:本文改编自Moshe Zadka在《Julia》中使用这种方法,Jim Hall在《Bash》中使用这种方法的文章。
在 awk 程序中猜数
让我们写一个Awk程序来实现“猜数字”的游戏。
Awk是一种动态类型,它是一种面向数据转换的脚本语言,对交互式使用有着令人惊讶的良好支持。Awk出现于20世纪70年代,最初是Unix操作系统的一部分。如果你不了解Awk,但是喜欢电子表格,这是一个可以学习Awk的信号!
您可以通过编写一个版本的“猜数字”游戏来开始探索Awk。
以下是我的实现(有行号以便我们能看到一些具体的功能):
1 BEGIN { 2 srand(42)3 random number = int(rand * 100)+1 4 print ” random number is “,randomNumber 5 printf “guess一个1到100之间的数\ n ” 6 } 7 { 8 guess = int($ 0)9 if(guess & amp;lt;randomNumber) { 10 printf “太低,再试一次:” 11 } else if(guess & amp;gt;随机数){12 printf “太高,再试一次:” 13} else {14 printf “没错\ n” 15 exit 16} 17}我们马上就能看出Awk控制结构与C或Ja的相似之处,但与Python不同。在if-then-else、while、then、else和while等语句中,部分接受由{和}包围的一个语句或一组语句。然而,Awk有一个很大的区别,需要从一开始就理解:
按照设计,Awk是围绕数据管道构建的。
这是什么意思?大多数Awk程序都是代码片段,它们接收一行输入,对数据进行一些处理,然后将其写入输出。认识到对这个转换管道的需要,Awk默认提供了所有的转换管道。让我们通过一个关于上述程序的基本问题来探究一下:“从控制台读取数据”的结构在哪里?
答案是——“内置”。特别是,第7-17行告诉Awk如何处理被读取的每一行。在这种情况下,很容易看出第1-6行是在读取任何内容之前执行的。
更具体地说,第1行的BEGIN关键字是一个“模式”,在这种情况下,它表示Awk应该在BEGIN in {…}在阅读任何数据之前。另一个类似的关键字END在这个程序中没有使用,它告诉Awk在读完所有内容后该做什么。
回到第7-17行,我们看到它们创建了一个类似于代码块{…},但是前面没有关键字。因为之前没有任何东西可以匹配Awk,所以它会用这一行来接收每一行输入。每一行的输入将由用户作为猜测输入。
让我们看看正在执行的代码。首先,在读取任何输入之前有一个前同步码。
在第2行,我们用数字42初始化随机数生成器(如果没有提供参数,则使用系统时钟)。为什么用42?当然选42!第3行计算1到100之间的一个随机数,第4行输出这个随机数用于调试。第5行邀请用户猜一个数字。注意这一行用的是printf,不是print。和C语言一样,printf的第一个参数是打印格式的模板。
既然用户知道程序需要输入,她可以在控制台上输入一个猜测。如前所述,Awk向第7-17行的代码提供了这种猜测。第18行将输入记录转换成整数;[23]表示整个输入记录,而表示输入记录的第一个字段,表示第二个字段,依此类推。是的,Awk使用预定义的分隔符(默认为空 grid)将输入行划分为组件字段。第9-15行将猜测结果与随机数进行比较,并打印出适当的响应。如果你猜对了,第15行将提前从输入行处理管道中退出。
就这么简单!
考虑到Awk程序不寻常的结构,代码片段将对特定的输入行配置和处理数据做出反应。让我们看看另一个结构,看看过滤部分是如何工作的:
1 BEGIN { 2 srand(42)3 random number = int(rand * 100)+1 4 print “随机数是”,randomNumber 5 printf “猜一个1到100之间的数\ n ” 6 } 7 int($ 0)& amp;lt;randomNumber { 8 printf “太低,再试一次:” 9 } 10 int $ 0 & amp;gt;随机数{11printf “太高,请重试:” 12} 13int ([26]) = =随机数{14printf “没错\ n” 15exit 16}第1–6行中的代码没有改变。但是现在我们看到第7-9行是输入整数值小于随机数时执行的代码,第10-12行是输入整数值大于随机数时执行的代码,第13-16行是两者相等时执行的代码。
这看起来“很酷但是很奇怪”——例如,为什么我们要重复计算int([27])?可以肯定的是,这样解决问题会很奇怪。但是这些模式确实是分离条件处理的非常好的方法,因为它们可以使用正则表达式或Awk支持的任何其他结构。
为了完整起见,我们可以使用这些模式将普通计算与仅适用于特定环境的计算分开。以下是第三个版本:
1 BEGIN { 2 srand(42)3 random number = int(rand * 100)+1 4 print ” random number is “,random number 5 printf ” guess 1和100 \ n ” 6 } 7 { 8 guess = int($ 0)9 } 10 guess & amp;lt;randomNumber { 11 printf “太低,再试一次:” 12 } 13 guess & ampgt;Randomnnumber {14 printf “太高,再试一次:” 15 } 16 guess = = randomn number { 17 printf “没错\ n” 18 exit 19}认识到这一点,无论输入什么值,都需要转换成整数,所以我们创建了第7-9行来完成这个任务。现在第10-12、13-15和16-19行引用定义的变量guess,而不是每次都转换输入行。
让我们回到我们想学的东西的列表:
变量 —— 是的,Awk 有这些;我们可以推断出,输入数据以字符串形式输入,但在需要时可以转换为数值输入 —— Awk 只是通过它的“数据转换管道”的方式发送输入来读取数据输出 —— 我们已经使用了 Awk 的 print和printf函数来将内容写入输出条件判断 —— 我们已经学习了 Awk 的 if-then-else和对应特定输入行配置的输入过滤器循环 —— 嗯,想象一下!我们在这里不需要循环,这还是多亏了 Awk 采用的“数据转换管道”方法;循环“就这么发生了”。注意,用户可以通过向 Awk 发送一个文件结束信号(当使用 Linux 终端窗口时可通过快捷键 CTRL-D)来提前退出管道。
不需要循环来处理输入的重要性是值得的。Awk之所以能长期存在,一个原因是Awk程序紧凑,另一个原因是不需要从控制台或者文件中读取那些格式代码。
让我们运行以下程序:
猜猜看。awk随机数是25猜一个1到100之间的数:50太高,再试一次:30太高,再试一次:10太低,再试一次:25没错$我们没有提到的一件事是笔记。Awk注释以#开始,在行尾结束。
总结
Awk非常强大,这个“猜数字”游戏是一个很好的入门方式。但这不应该是你探索Awk的终点。可以看看Awk和Gawk(GNU Awk)的历史。Gawk是awk的扩展版本。如果你在电脑上运行Linux,可能会有这个。或者,从它的原始开发者那里读到关于原始版本的各种信息。
你也可以下载我们的小抄来帮助你记录你所学的一切。
Awk备忘单
途经:https://opensource.com/article/21/1/learn-awk
作者:克里斯·赫尔曼森题目:lujun9972译者:FYJNEVERFOLLOWS校对:wxy
本文由LCTT原创,并由Linux中国提供荣誉。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。