免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1482 | 回复: 0
打印 上一主题 下一主题

awk随笔4 -- 变量作用域,如何定义局部变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-05 11:48 |只看该作者 |倒序浏览
在awk中,所有变量都是全局变量,本来是没有局部变量的概念的。这样就会造成自定义函数中的变量有可能和主程序其他部分重名,因而发生错误。例如如下的代码:
function factorial(n)
{
           s=1;
for (i=1; i<=n; i++)
{         s *= i;}
return s;
}
{
for (i=1; i<=10; i++)
{
value = factorial(i);
printf("fac(%d) = %d\n", i, value);
}
}
会因为i的重复定义造成结果错误。
那么怎么解决这个问题呢?
两个办法:1.每个函数里面的变量都加上特定的前缀,避免变量名的重复,但是这是一个笨办法,这样会造成代码的易读性下降,同时也增加了输入的麻烦。
2.利用局部变量的办法来解决,如果函数内的变量生存周期限制在函数内部的话,这个问题就简单了。通过查看资料,得到“Awk 提供了一种蹩脚的方式来定义局部变量,那就是通过函数的参数列表”。在gawk手册里面也有如下的说明,gawk 手册中 “USER-DEFINED FUNCTIONS” 一节中找到了相似的一段话:“由于原来的 Awk 不支持函数,局部变量在 Awk 中的实现相当笨拙,通过给函数定义额外的参数来实现。按照惯例,在真实参数后面多加几个空格,以分隔真实参数与局部变量声明。”
具体实现如下:
首先定义function
function factorial(n, _ARGVEND_, i, s) #添加_ARGVEND_ 分割传递的参数和局部变量,_ARGVEND_后面的就是自定义的局部变量
接着调用时 value = factorial(i);参数表里面只有传递一个参数
按照上述的办法,在function factorial里面,变量i,s就完全是一个局部变量了,不管脚本的其他部分是否定义了重名的变量,都能够保证这个函数的调用是完全安全的。
 


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/42925/showart_476395.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP