繁体   English   中英

Perl脚本读取标记之间的内容

[英]perl script to read content between marks

在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 ;         
    }
}

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

谢谢

谢谢

您可以使用范围运算符:

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

输出也将包括* _DATA行,但要摆脱它们并不难。

除了一些拼写错误之外,您的代码距离还不太远。 你曾经用过

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

使用正则表达式是一件非常简单的事情,只需使用/ s或/ m(单行或多行)标志-/ s允许使用. 运算符以匹配换行符,因此您可以执行/start_data(.+)end_data/is

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM