在处理文本时,经常遇到这种情况:就是我们须要把两行文本做一个比較,然后选择性输出。

而在while(<FILEHAND>){do something}程序块中默认仅仅能一次读取一行。笔者在这里,举一个简单的样例来说明怎么处理这种情况。

有一个这样一段文本:

a 1 2 3 4

a 5 6 7 8

a 6 7 8 9

a 7 8 9 11

a 7 8 9 12

a 13 12 14 15

a 18 14 16 17

a 2 3 4 65

要求是这种:假设上一行的第5列数字大于下一行第二列的数字。就把这两行都输出。

策略一:把输入文本存放到数组中,然后利用for循环,一次输出两行做推断。

脚本例如以下:

#! /usr/bin/perl -w
use strict;
chomp(my @a=<DATA>);
my @out;
for(my $i=0;$i<$#a;$i++){
my ($a1,$a2)=(split/\s+/,$a[$i])[1,4];
my ($b1,$b2)=(split/\s+/,$a[$i+1])[1,4];
push @out,@a[$i,$i+1] if $a2 > $b1;
}
my %ha;
my @new=grep {$ha{$_}++<1}@out;
print $_,"\n" for@new;
__DATA__
a 1 2 3 4
a 5 6 7 8
a 6 7 8 9
a 7 8 9 11
a 7 8 9 12
a 13 12 14 15
a 18 14 16 17
a 2 3 4 65

策略一思路比較简单,可是假设输入文本过大。比較消耗内存。

当然使用Tie::File模块又是另外一回事情了。

在这里,笔者利用tell和seek函数,对句柄定位做一下调整,就能够在while循环中。实现一次输出多行。一行多次输出了,是不是非常方便呢?

代码例如以下:

#! /usr/bin/perl -w
use strict;
my @out;
while(<DATA>){
chomp;
my $pos=tell(DATA);
my @a=split/\s+/,$_;
my $sec=<DATA>;
if($sec){
chomp$sec;
my @b=split/\s+/,$sec;
if($a[4]>$b[1]){
push @out,$_,$sec;
}
}
seek(DATA,$pos,0);
}
my %ha;
my @new=grep $ha{$_}++ < 1,@out;
print $_,"\n" for@new;
__DATA__
a 1 2 3 4
a 5 6 7 8
a 6 7 8 9
a 7 8 9 11
a 7 8 9 12
a 13 12 14 15
a 18 14 16 17
a 2 3 4 65

程序执行的结果例如以下:

a 5 6 7 8

a 6 7 8 9

a 7 8 9 11

a 7 8 9 12

a 18 14 16 17

a 2 3 4 65

__结束__

perl一次读取多行文本的策略的更多相关文章

  1. 分享:Perl打开与读取文件的方法

    在Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读写定位等操作. Perl打开与读取文件的方法,供大家学习参考.本文转自: ...

  2. getline读取整行文本// isprint

    getline——读取整行文本 这个函数接受两个参数:一个输入流对象和一个string对象.getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符.和输入操作符不一样 ...

  3. Perl中文件读取操作

    Perl中文件读取操作 http://blog.csdn.net/yangxuan12580/article/details/51506216

  4. perl 利用管道读取压缩文件内容

    perl的文件句柄不仅支持普通文件, 还支持管道,今天需要统计一个fastq文件中的序列数和碱基数,而NGS的fastq文件一般都是gzip压缩的,所以 需要读取压缩文件中的内容,代码如下: my ( ...

  5. Perl 语法 - 高级特性

    总结: q().qq().qw(同单引号).qx{牢记是花括号},分别是单引号.双引号.创建字符串列表 和 捕获命令输出.   第9学时 其他函数和运算符 一件事情可以使用多种方法完成. 有哪些其他的 ...

  6. Perl输出复杂数据结构:Data::Dumper,Data::Dump,Data::Printer

    输出复杂结构 Data::Dumper.Data::Dump.Data::Printer都可以用来输出复杂的数据结构.本文只介绍简单的几个输出形式,以后再需要的地方再详细介绍. 前两者建议传递数据结构 ...

  7. perl open函数的使用

    本文和大家重点讨论一下如何读写Perl文件,主要包括打开.关闭Perl文件,读写Perl文件,Perl文件的状态,命令行参数和打开管道六部分内容,希望通过本文的学习你对读写Perl文件有深刻的认识. ...

  8. GOM通区插件-支持GOM绝对路径-读取配置项-分割字符等功能。不定期更新

    A-A+ 2019年07月19日 Gom引擎 阅读 45 views 次   [@Main] #IF #SAY [<读配置项/@读配置项>] [<写配置项/@写配置项>] [& ...

  9. Spark读取配置(转)

    转自:https://github.com/keepsimplefocus/spark-sourcecodes-analysis/blob/master/markdowns/Spark%E8%AF%B ...

随机推荐

  1. hdu 1172 猜数字

    猜数字 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. BZOJ4300 绝世好题 【dp】

    题目 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入格式 输入文件共2行. 第一行包括一个整数n. 第二行包括n个 ...

  3. 封装的方法--读取任何路径下的properties文件中的值

    概述:我们在做项目时,经常需要从某个properties文件中读取properties文件中的值.现在我封装了一下方法,直接读取配置文件中的值. 代码如下所示: /** * Created by qi ...

  4. Windows Server 创建环回网卡

    1.以管理员身份运行cmd后,在cmd命令窗口中执行:hdwwiz 启动硬件添加向导. 2.在添加硬件向导中选择手动安装或自动搜索都可以.然后选择网络适配器. 3.选择网络适配器:厂商选择Micros ...

  5. Hibernate中inverse="true"的理解

    Hibernate中inverse="true"的理解 举例如下 转自:http://lijiejava.iteye.com/blog/776587 Customer类: publ ...

  6. loj 数列分块入门 6 9(区间众数)

    6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vecto ...

  7. 疫情控制(NOIP2012)庆祝2012满贯!٩(๑•◡-๑)۶ⒽⓤⒼ

    丧病至极的D2T3啊! 好吧~ 先放个传送门~ 原题传送门 好吧,这道题呢.. 根据题意我们可以很明显的看出来 军队往上走的越多(在没到根节点之前),效益一定越大.. 所以可以分情况讨论: 对于无法走 ...

  8. greasemonkey

    Greasemonkey Hacks/Getting Started < Greasemonkey Hacks Greasemonkey Hacks Foreword Credits Prefa ...

  9. Javascript报错Converting circular structure to JSON 错误排解

    在运行nodejs程序的时候报出以下的错误: 2017-11-20 17:44 +08:00: TypeError: Converting circular structure to JSON at ...

  10. hdu 5087(次长上升子序列)

    Revenge of LIS II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...