用户名: 密码: 忘记密码? 注册

Perl的array 动态添加 push unshift pop shift

作者:  时间: 2010-12-22
废话不多讲,直接上需求
有一个文件,里面每一行保存一条记录,每一条记录有两个字段,第一个字段为数字,第二个字段表示被提取的内容,第一个字段表示内容在对应文件的行数。
现在,我假定行数相同的内容划分为同一类。需要做的就是,统计总共有多少类,并将每条记录所属类别标记出来,写到文件中。。
下面是源代码(countCLS.pl):
  1 #!/usr/bin/perl
  2 my $in = $ARGV[0];
  3 my @cls;
  4 die "no input file" if(!defined($in));
  5 open(RH,$in) or die "Cannot read $in:$!";
  6 my @lines = <RH>;
  7 close RH or die "Cannot close $in:$!";
  8 for(my $i = 0; $i < @lines; $i++){
  9     my @fields = split(/\t/,$lines[$i]);
 10     #&check($fields[0],*cls);
 11     my $j;
 12     for($j = 0; $j < @cls; $j ++){
 13         if($fields[0] == $cls[$j]){
 14             print "$j\n";
 15             last;
 16         }
 17     }
 18     if($j >= @cls){
 19         print "$j\n";
 20         push(@cls,$fields[0]);
 21     }
 22 }
 23 print "MAX:".scalar(@cls)."\n";
分析:
首先将文件读到数组中,对每一行执行下面的操作,首先将该行split到数组里,然后,查询cls数组,看该行的行数字段是否存在于cls数组中,如果存在,说明这一类已经存在了,打印类的索引,若不在数组中,说明这一类刚刚出现,打印数组个数,然后将该行数放入数组中。
需要意识到的是,首先perl中的数组是动态数组,是你在程序运行过程中动态可以添加的,这点使得程序设计方便了一些,试想在没有动态数组的情况下,至少首先需要一个够大的静态数组,然后还得配一个记录数组个数的变量。再有就是,perl中提供了push函数,又方便一些。。。虽然。可以将20行改成 $cls[$j] = $fields[0]...