perl一次读取多行文本的策略
2017-05-02 12:42
211 查看
在处理文本时,经常遇到这种情况:就是我们须要把两行文本做一个比較,然后选择性输出。
而在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循环,一次输出两行做推断。
脚本例如以下:
策略一思路比較简单,可是假设输入文本过大。比較消耗内存。
当然使用Tie::File模块又是另外一回事情了。
在这里,笔者利用tell和seek函数,对句柄定位做一下调整,就能够在while循环中。实现一次输出多行。一行多次输出了,是不是非常方便呢?
代码例如以下:
程序执行的结果例如以下:
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
__结束__
而在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一次读取多行文本的策略
- 开启一个文本文件,一次读取其内的一行文本。令每一行形成一个String,并将读出的String对象置于LinkedList中。请以相反次序印出LinkedList内的所有文本行
- 开启一个文本文件,一次读取其内的一行文本
- C++多行文本读取
- 关于一次文本读取的速度测试 TStringList PK AssignFile
- perl一次读取多行
- dxfgrabber简单读取dxf文件中的多行文本和单行文本信息
- perl:匹配多行文本
- Java 一次读取文本中全部内容
- 利用缓冲流来实现多行文本的读取
- textarea中的多行文本(有换行)的内容提交到access数据库中 ,如何读取出来和编辑时一样
- Perl一次读取文件的方法
- sharepoint读取启用了追加功能的多行文本的历史版本记录
- 开启一个文本文件,一次读取其内的一行文本
- JavaSE8基础 FileInputStream read 读取只有英文和数字的txt文本文件(一次一字节)
- PowerShell中读取多行文本示例
- sharepoint开发技巧:读取启用了追加功能的多行文本的历史版本记录
- sharepoint开发技巧:读取启用了追加功能的多行文本的历史版本记录
- Perl读取文本格式化后写入文本
- C++ 读取中文文本 。。。。