[英]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.