perl脚本来读取标记之间的内容

时间:2011-11-06 00:49:23

标签: regex perl

在perl中,如何读取两个标记之间的内容。像这样的源数据

START_HEAD
ddd
END_HEAD

START_DATA
eee|234|ebf
qqq|              |ff
END_DATA

--Generate at 2011:23:34

然后我只想获取“START_DATA”和“END_DATA”之间的数据。怎么做?

sub readFile(){ 
    open(FILE, "<datasource.txt") or die "file is not found";

    while(<FILE>){      
        if(/START_DATA/){           
            record(\*FILE);#start record;
        }
    }
}

sub record($){
    my $fileHandle = $_[0];

    while(<fileHandle>){
        print $_."\n";      
        if(/END_DATA/) return ;         
    }
}

我写这段代码,它不起作用。你知道为什么吗?

由于

由于

3 个答案:

答案 0 :(得分:6)

您可以使用范围运算符:

perl -ne 'print if /START_DATA/ .. /END_DATA/'

输出也包括* _DATA行,但是它们不应该很难摆脱它们。

答案 1 :(得分:3)

除了一些拼写错误,你的代码也不算太远。你用过

use strict;
use warnings;

你可能已经弄明白了。这是我发现的:

  • 如果您不需要原型,或者不知道他们做了什么,请不要使用原型。

普通子声明为sub my_function (prototype) {,但您可以省略原型并使用sub my_function {

  • while (<fileHandle>) {缺少$符号表示它是 变量(标量)而不是全局变量。应该是$fileHandle
  • print $_."\n";会添加额外的换行符。只需print;即可 你期待什么。
  • if(/END_DATA/) return;是语法错误。支架不是可选的 在这种情况下在perl中。除非你扭转声明。

使用:

return if (/END_DATA/);

if (/END_DATA/) { return }

以下是已清理的版本。我在测试时注释了你的open(),所以这将是一个功能代码示例。

use strict;
use warnings;

readFile();

sub readFile { 
    #open(FILE, "<datasource.txt") or die "file is not found";
    while(<DATA>) {      
        if(/START_DATA/) {
            recordx(\*DATA); #start record;
        }
    }
}

sub recordx {
    my $fileHandle = $_[0];
    while(<$fileHandle>) {
        print;
        if (/END_DATA/) { return }         
    }
}

__DATA__
START_HEAD
ddd
END_HEAD

START_DATA
eee|234|ebf
qqq|              |ff
END_DATA

--Generate at 2011:23:34

答案 2 :(得分:0)

使用正则表达式非常简单,只需使用/ s或/ m(单行或多行)标志 - / s允许.运算符匹配换行符,这样就可以了/start_data(.+)end_data/is