簡體   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