金鳞

目标->软件测试架构师

自:http://www.builder.com.cn/2002/0517/48549.shtml

 作为一名程序员我得应付各种五花八门的客户问题。最近做一个活的时候,编程中要求从某种应用程序中导出用符号分隔的普通文件并且对其进行格式化,这样才能把它导入另一种应用程序。这个文件中的数据包含了3000个数据项,而且项目描述采用了变长字段,我得设法把这种格式转换成3个30字符长的字段。方法有二:使用文本编辑器编辑3000个条目或者写一个Perl脚本来完成这一任务。显然,我当然得选择第2种方案。
脚本

清单A 就是我编写的脚本。这里我也不拿什么算法和程序设计说事,也就直接带你阅读这个脚本程序来掌握Perl 5的主要语句。这个脚本是在Windows 98计算机上用ActiveState开发的ActivePerl编写的。编写和测试脚本用了三个小时,确定基本算法用了大约一个小时,另两个小时是程序的反复精练。

这是一个“快餐型”的脚本程序,不过话又说回来,就说明Perl的关键的功能和构造而言还是足够了

$input = “Inventory.txt”; #设置$input为符号分隔文件名
$output = “>inv.txt”; #设置$output为输出文件名


以上的代码显示了Perl的字符串变量定义方式(比如,$variable_name = “string”;)。Perl语句用分号结束(;)。用#符号表示注释。

open (INV, $input); #打开$openme 供读取数据
open (OUTFILE, $output); #打开Inv.txt 供写入数据

Open语句用来打开文件以实现读、写或添加操作。Open语句的第1个参数是将为其他语句作为参数使用的文件句柄(filehandle)的名字(文件句柄是一种数据结构,Perl脚本通过它可以访问文件)。第1个参数是包含文件名字符串的变量。在我定义 $output 时我用 > 告诉解释器打开Inv.txt写入数据。要是为添加数据而打开文件的话就要用到 >> 了。

while语句在执行花括号内的代码之前会对执行条件进行测试。当条件测试为false时即退出循环。在这种情况下,循环会连续执行直到到达文件末尾。

$offset =0; #最初的30字符字段偏移
$TheLine = $_;  #设置$TheLine为当前行


接下来的这两行代码声明和初始化输出字符串格式化所需要的两个整数变量。第二行把输入文件的当前行赋给$TheLine变量。Perl用$_当作默认的输入和模式匹配变量。在这个例子中,它的值是由while语句赋予的。

chomp($TheLine); #删除换行符

chomp语句用来删除行终止符,例如换行符等。

@cols = split(" ",$TheLine); #占位符分隔

以上语句介绍了Perl编程中两个不可或缺的方面。Perl语言中的数组以@打头而且被分配了一列元素。split语句有两个参数:将被分隔的字符和被分隔的字符串。Split返回元素列表。

$splitme = $cols[6];  #把第7列的字符串赋给$splitme(项目描述)

上句的作用是指向数组中的元素。数组按照从0到(N-1)的序列索引,其中的N是元素总数。

@splitup = split('',$splitme); #把字符串转换为字符数组
if ($#splitup >= 30) { #如果超过30个字符


以上代码的第二行介绍了第二种条件表达式:if语句。如果If语句括号内的条件得到满足则执行相应的代码。Perl用$#array_name在数组中存储最后一个元素的索引。

for($i = 0; $i <= 10; $i++) { #找出最后10个字符中的第1个空格

现在介绍for循环。Perl语言中的for循环结构类同C、C++或Java等编程语言中的for循环。For循环的语法是这样的:for(initial condition; exit condition; increment statement).

if ($splitup[(30 - $i)]=~ /W/) { #检查空格

这条 if语句中的条件又是一个新概念。这里,我采用了所谓的正则表达式,具体地说就是模式匹配。如果字符串包含空格该语句将返回true。模式匹配条件的语法如下所示:$string =~ /pattern/.

清单B 中的最后一行代码演示了 join函数。Join差不多就是split的反面。Join也有两个参数:分隔符和元素数组。Join会返回一个字符串,这个字符串是通过连接数组元素并在每两个元素之间放置分隔符之后构成的。

清单C结尾你还会发现一个 else语句。如果 if语句的条件无法满足就会执行else语句牵涉的代码。

if ($#splitup <=0 ){ $newguy = " ";} #如果没有说明就分配3个字段
$cols[6] = $newguy; #在数组中插入 3 个字段描述
$newline = join (" ",@cols); #创建输出字符串
print OUTFILE $newline . " "; #把输出字符串写入文件


现在我们到了写数据的阶段。Print函数用来打印字符串。如果没有给定文件句柄该函数会把结果打印到标准 I/O设备。在示例语句中,只要创建一行数据我就给输出文件写入一行。你可以在字符串之后加上句号。
}#结束while循环
close OUTFILE; #关闭输出文件


这里,循环执行到文件的末尾,于是我们关闭输出文件以便它从内存获取数据存储到磁盘。close语句只有一个参数,也就是它要关闭的文件句柄。

小结

下面就是我在编写以上脚本中用到的Perl知识:

  • 变量(数值变量和数组)
  • 流程控制(while和for循环以及if/else语句)
  • 正则表达式
  • 函数(chomp、join和split)
  • 文件输入/输出

Perl是一种很容易在掌握的脚本编程语言,网上有很多学习资源可以帮助你获得有用的指导信息和相关资料,比如learn.perl.org 和O’Reilly的perl.com都是相当不错的站点。

posted on 2008-12-11 15:48 金鳞 阅读(598) 评论(0)  编辑 收藏 引用 所属分类: perl
只有注册用户登录后才能发表评论。