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" [email protected];
__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" [email protected];
__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一次读取多行文本的策略,布布扣,bubuko.com

时间: 2024-08-24 17:53:21

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

Perl读取Excel,转化成html table

今天打算用Perl实现以下读取Excel,并将之转化成html的table. 网上搜索了一下,读取Excel的包Spreadsheet::ParseExcel比较好,强大的cpan,让我一条命令就下载安装了它:cpan Spreadsheet::ParseExcel #!/usr/bin/perl -w use strict; use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::FmtUnicode; my $parser = Sp

linux10个命令快速掌握linux服务器负载

如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?通过十条命令在一分钟内对机器性能问题进行诊断. 概述 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DEV 1 sar -n TCP,ETCP 1 top 其中一些命令需要安装sysstat包,有一些由pr

用十条命令在一分钟内检查 Linux 服务器性能

原文地址: http://www.oschina.net/news/69132/linux-performance 如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断. 概述 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1

重拾C++ 基础知识总结(二)

1.标准库string类型: 用户程序要使用string类型对象,必须包含相关头文件 #include <string> 字符串字面值与标准库string类型不是同一种类型,字符串字面值是字符数组,而string是对象 2. int main(){ string s; cin>>s; cout<<"s="<<s<<endl; } string类型的输入操作符: 读取并忽略开头所有的空白字符:读取字符直至再次遇到空白字符,读取终

[Erlang 0129] Erlang 杂记 VI

把之前阅读资料的时候记下的东西,整理了一下. Adding special-purpose processor support to the Erlang VM   P23 简单介绍了Erlang Compiler和Beam文件格式; The Erlang Compiler in short 章节提到了 Core Erlang 这个之前有提到过: [Erlang 0120] Know a little Core Erlang http://www.cnblogs.com/me-sa/p/know

用十条命令在一分钟内检查Linux服务器性能

如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?Netflix性能工程团队的Brendan Gregg写下了这篇博文,兄弟连Linux培训 小编整理如下:一起来看他们是怎样通过十条命令在一分钟内对机器性能问题进行诊断. 概述 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -

检查 Linux 服务器性能

如何用十条命令在一分钟内检查 Linux 服务器性能 如果你的Linux服务器突然负载暴增,报警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断. 概述 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DE

C++ Primer 第四版读书笔记(二)之标准库类型

C++定义了一个内容丰富的抽象数据类型标准库,其中最重要的标准库类型是string和vector,它们分别定义了大小可变的字符串和集合.string和vector往往将迭代器用作配套类型,用于访问string中的字符,或者vector中的元素. 另一种标准库类型为bitset,提供了一种抽象方法来操作位的集合. string类型支持长度可变的字符串,vector用于保存一组指定类型的对象. bitset类标准库类型提供了更方便和合理有效的语言级的抽象设施.通过这个类可以把某个值当作位的集合来处理

检查Linux服务器性能的关键十条命令

检查Linux服务器性能的关键十条命令 概述 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DEV 1 sar -n TCP,ETCP 1 top 其中一些命令需要安装sysstat包,有一些由procps包提供.这些命令的输出,有助于快速定位性能瓶颈,检查出所有资源(CPU.内存.磁盘IO等)的利用率(uti