0

配列から特定の範囲の要素を削除したいと思います。
私はtxtファイルを持っています:

Rbody ...
333
444
555
666
END

Shell ...
Node ...

Rbody ...
333
444
555
666
END

私がしたいのは、「Rbody」という単語から「END」という単語までの要素をファイルから削除することです。

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

Rbodyという単語を含む行のみを削除します...ちょっとループが必要だと思います。:/

あなたの助けをありがとう。

4

4 に答える 4

3

少し難解ですが、これは「フリップフロップ」演算子の適切な使用例です。

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

この式は、正規表現に一致する/^Rbody/ .. /^END/まで false を返します。その後、一致するまで true を返します。$_/^Rbody//^END/

于 2013-03-20T16:23:43.510 に答える
1

2 つのループを使用してみてください。外側のループは通常どおり行を読み取ります。のような行が見つかった場合/^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 );
   }
}
于 2013-03-20T16:03:56.723 に答える
0

残念ながら、どのバージョンも動作しないようです:

最初のバージョンはすべての行を出力し、他の 2 つは出力を提供しません。

私のテキストは次のようになります。

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;
于 2013-03-21T07:10:03.097 に答える
0

現在の行を印刷するかどうかを追跡する状態変数を使用するだけです。

use strict;
use warnings;

my $print = 1;

while (<DATA>) {
  if ($print) {
    $print = 0 if /^Rbody/i;
    print if $print;
  }
  elsif (/^END$/) {
    $print = 1;
  }
}
于 2013-03-20T17:45:02.877 に答える