perl一次读取多行文本的策略
在处理文本时,经常遇到这种情况:就是我们须要把两行文本做一个比較,然后选择性输出。
而在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一次读取多行文本的策略的更多相关文章
- 分享:Perl打开与读取文件的方法
在Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读写定位等操作. Perl打开与读取文件的方法,供大家学习参考.本文转自: ...
- getline读取整行文本// isprint
getline——读取整行文本 这个函数接受两个参数:一个输入流对象和一个string对象.getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符.和输入操作符不一样 ...
- Perl中文件读取操作
Perl中文件读取操作 http://blog.csdn.net/yangxuan12580/article/details/51506216
- perl 利用管道读取压缩文件内容
perl的文件句柄不仅支持普通文件, 还支持管道,今天需要统计一个fastq文件中的序列数和碱基数,而NGS的fastq文件一般都是gzip压缩的,所以 需要读取压缩文件中的内容,代码如下: my ( ...
- Perl 语法 - 高级特性
总结: q().qq().qw(同单引号).qx{牢记是花括号},分别是单引号.双引号.创建字符串列表 和 捕获命令输出. 第9学时 其他函数和运算符 一件事情可以使用多种方法完成. 有哪些其他的 ...
- Perl输出复杂数据结构:Data::Dumper,Data::Dump,Data::Printer
输出复杂结构 Data::Dumper.Data::Dump.Data::Printer都可以用来输出复杂的数据结构.本文只介绍简单的几个输出形式,以后再需要的地方再详细介绍. 前两者建议传递数据结构 ...
- perl open函数的使用
本文和大家重点讨论一下如何读写Perl文件,主要包括打开.关闭Perl文件,读写Perl文件,Perl文件的状态,命令行参数和打开管道六部分内容,希望通过本文的学习你对读写Perl文件有深刻的认识. ...
- GOM通区插件-支持GOM绝对路径-读取配置项-分割字符等功能。不定期更新
A-A+ 2019年07月19日 Gom引擎 阅读 45 views 次 [@Main] #IF #SAY [<读配置项/@读配置项>] [<写配置项/@写配置项>] [& ...
- Spark读取配置(转)
转自:https://github.com/keepsimplefocus/spark-sourcecodes-analysis/blob/master/markdowns/Spark%E8%AF%B ...
随机推荐
- POJ 3304 Segments | 线段相交
#include<cstdio> #include<algorithm> #include<cstring> #define N 105 #define eps 1 ...
- 雅礼集训 Day6 T2 Equation 解题报告
Equation 题目描述 有一棵\(n\)个点的以\(1\)为根的树,以及\(n\)个整数变量\(x_i\).树上\(i\)的父亲是\(f_i\),每条边\((i,f_i)\)有一个权值\(w_i\ ...
- 身为多年的ubuntu用户。。。
在这之前 说是多年也没有多年,事实上也就两年.. 不得不说一句,终于承受不住不稳定之重了... 个人觉得开始还是从centos开始比较好,比如说现在的我.. 之前看过的不知道在哪里的文章,谈论的是ub ...
- NuGet Package Manager 实用命令
Creating Help Pages for ASP.NET Web API Install-Package Microsoft.AspNet.WebApi.HelpPage Install-Pac ...
- QLineEdit使用总结(转)
本文转自 https://www.cnblogs.com/hellovenus/p/5183593.html
- linux下挂载U盘【转】
转自:http://www.cnblogs.com/yeahgis/archive/2012/04/05/2432779.html 一.Linux挂载U盘:1.插入u盘到计算机,如果目前只插入了一个u ...
- Nginx整合PHP原理
安装Nginx 在网上,看到不少人装Nginx 时非常麻烦,配置时用了一大堆选项,请问你们真实现那么多功能么?害的我越看越郁闷.此次安装Nginx如果是按着上面笔者的步骤一步步走下来,安 ...
- C++ DLL导出类 知识大全
在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架.在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发. 参考了很多这方面的资料,对DLL有一个基本全面的了解.有一个问题 ...
- windwos grpc 编译
此文档是windwos grpc c++ 编译 ,基于 vs2015 编译完成 获取gRPC源码 gRPC是开源框架,项目代码在github上,所以首先要安装github.github安装后,在指定文 ...
- 使用函数方式生成UUID
1.默认生成的UUID是有 “-” 分隔符的 例如: public static void main(String[] args){ String uuid = UUID.randomUUID().t ...