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