在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 ;
}
}
我写这段代码,它不起作用。你知道为什么吗?
由于
由于
答案 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
。