2013-03-20 83 views
0

我想從陣列中刪除特定範圍的元素。
我有一個txt文件:如何從陣列中刪除元素的特定區域

Rbody ... 
333 
444 
555 
666 
END 

Shell ... 
Node ... 

Rbody ... 
333 
444 
555 
666 
END 

我想要做的是去除開始,直到從我的文件「END」字的詞「Rbody」的元素。

#while (<INC>) { 
# if (!/^RBODY/) 
# { 
#  push(@alllines,$_); 
# } 
#} 

只刪除單詞Rbody的行...我想我需要一些有點循環。 :/

Thx for your help。

+0

各自以txt文件的單獨行?你也必須保存這些不知何故,或者你只需​​要創建一個沒有這些條目的文本文件?另外,是Rbody ... 333 444 555 666結束一行,你必須刪除該行? – KateMak 2013-03-20 15:25:14

+0

'splice'怎麼樣? – squiguy 2013-03-20 16:08:45

+0

@squiguy:不,它不是一條線。 Rbody是可以說第一個和第十個..之間的一些數據。應該刪除整個塊,其餘的數據應該分別放入我的數組中。 – 2013-03-21 07:01:12

回答

1

嘗試使用兩個循環。外循環正常讀取這些行。如果發現像/^Rbody/i一條線,那麼它會使用一個內部循環跳過一切,直到看到「END」:

while(defined(my $line = <INC>)){ 
    chomp($line); 
    if($line =~ /^Rbody/i){ 
     while(defined($line = <INC>)){ 
      chomp($line); 
      last if $line eq "END"; 
     } 
    } else { 
     push(@alllines, $line); 
    } 
} 
3

這是一個有點深奧,但是這是一個很好的用例爲"flip-flop" operator

while (<INC>) { 
    push @alllines, $_ unless /^Rbody/ .. /^END/; 
} 

表達/^Rbody/ .. /^END/返回false,直到$_正則表達式匹配/^Rbody/。然後它返回true,直到它匹配/^END/

+0

謝謝您的鏈接!它現在有效! – 2013-03-21 07:14:14

+0

您應該將此標記爲答案;) – KateMak 2013-03-24 18:38:50

0

只需使用一個狀態變量來跟蹤是否應打印當前行。

use strict; 
use warnings; 

my $print = 1; 

while (<DATA>) { 
    if ($print) { 
    $print = 0 if /^Rbody/i; 
    print if $print; 
    } 
    elsif (/^END$/) { 
    $print = 1; 
    } 
} 
0

遺憾的是沒有版本似乎工作:

第一個版本打印每一行,其他兩個不提供輸出。

我的文字是這樣的:

RBODY/
sdsd 
sdsdsd 
sdsd 
     END 

SHELL/9171781 9001914 9073136 9073137 9073118 9073115       
SHELL/9171782 9001914 9073117 9073120 9073119 9073116       
SHELL/9171783 9001914 9073118 9073121 9073120 9073117       
SHELL/9171784 9001914 9073137 9073138 9073121 9073118       
SHELL/9171785 9001914 9073120 9073123 9073122 9073119       
SHELL/9171786 9001914 9073121 9073124 9073123 9073120       
# [SDM:HISTORY:VERSION] = "History_Variante_DGS" 
# 
# S01__B70D_revo: *Autor: revo 
#     *Datum: 11.12.12 
#     *Basis: ------- 
#     - automatischer Positionierungsprozess 
#     - verwendetes Dummysessionfile: Sessiondummy____au481_______LFaH3_sitzpos_S01__B70D_revo.ses 
#     - verwendetes Gurtsessionfile : Sessiongurt_____au481_______LFaH3_sitzpos_S01__Basi_revo.ses 
#     - verwendetes Sitzsessionfile : Sessionsitz_____au481__0____LFaH3_sitzpos_S01__B001_revo_k14m.ses 
# 
# 

代碼到現在爲止:

#!/usr/bin/perl 
# 
#print "Bitte geben sie das Dummy Include an:\n"; 
#chop($dummyfile = <>); 
#print "\n"; 
#print "Bitte geben sie das Basis Include an:\n"; 
#chop($basisfile = <>); 
#print "\n"; 

$dummyfile = 'Dummy_mu5070b___mvs2g__1_cb21_k19_m04F_bsd_w3_bfrei__krmi_040_.inc'; 
$newinc = "dummy_include.inc"; 
open(INC, $dummyfile); 
open(NEWINC, ">$newinc"); 


.... missing regex 


print @alllines;