2

これは私のテキストファイルです...特定のデータを検索して保存し たい...出力需要履歴を検索してから印刷したいすべての*出力フィールドを検索してその値=234のみを保存し、そのデータ、つまりabcを印刷します、dfg、jh、

入力ファイル:

*output folk
 .....
 ....
 ....
*output demand history
*output integ
sd,
lk,
pk,
*output field, value=234;hoxbay edt
abc,
dfg,
jh,
*output field, value=235;hoxbay edt
jh,
lk,
*output fix, value=555;deedfgh
re,
ds,
*fgh ,val=098;ghfd
dsp=pop
mike oop...


**i want this output only........**

出力:

*output field, value=234;hoxbay edt
abc,
dfg,
jh,
*output field, value=235;hoxbay edt
jh,
lk,
*output fix, value=555;deedfgh
re,
ds,

私はこれを試しました.....しかし、私は後に停止する方法がわかりません

output fix, value=555;deedfgh
re,
ds,

コード:

use strict;
use warnings;
use Data::Dumper;

open(IN , "<" , "a.txt");

my $flag=0;

foreach my $line(<IN>)
{
  if($line=~/^\*output demand history/i)
  {
    print $line;
    $flag=1;

  }

  if($line=~/^\*OUTPUT field/i && $flag==1)
  {
    print $line;
    my @array1=split("," ,$line);
    my $temp1=shift @array1;
    my @array2=split(";",$temp1);
    my $elset=shift @array2;

  } 

  if($line=~/^\*OUTPUT FIX/i && $flag==1)
  {
    print $line;

    my @array3=split("," ,$line);
    my $temp2=shift @array3;
    my @array4=split(";",$temp2);
    my $nset=shift @array4;
  }
}
4

4 に答える 4

1

すべての条件が満たされたときに、入力された行を単純に印刷する場所がわかりません。

ループのどこかに必要です:

if ($flag2) {
   print $line;
}
于 2012-08-04T15:52:10.473 に答える
1

多分それはあなたが望むものです:

use 5.010;
$flag;
while (<IN>) {
    given ($_) {
        when (/^\*output/)  { $flag= 0; continue; }
        when (/value/)      { $flag = 1; }
    }
    print if $flag;
}
于 2012-08-04T15:59:41.110 に答える
1

何が必要かを正確に伝えるのは難しいですが、このプログラムは役立つかもしれません

use strict;
use warnings;

open my $fh, '<', 'a.txt' or die $!;

my @data;
while (<$fh>) {
  chomp;
  if (/^\*/) {
    print "@data\n" if @data;
    @data = ();
    push @data, $1 if /^\*output\s+(?:field|fix),\s*(.+?)\s*;/;
  }
  else {
    push @data, $_ if @data;
  }
}
print "@data\n" if @data;

出力

value=234 abc, dfg, jh,
value=235 jh, lk,
value=555 re, ds,

回答から、aで始まり、。で始まる次の行までを*含む行を印刷したいようです。value=*

このコードを試してください

use strict;
use warnings;

open my $fh, '<', 'a.txt' or die $!;

my $wanted;
while (<$fh>) {
  $wanted = /value/ if /^\*/;
  print if $wanted;
}

出力

*output field, value=234;hoxbay edt
abc,
dfg,
jh,
*output field, value=235;hoxbay edt
jh,
lk,
*output fix, value=555;deedfgh
re,
ds,
于 2012-08-04T18:00:59.100 に答える
1

フリップフロップを使用する1つのバージョン:

perl -ne'print if (/^\*output .*value=/ .. ($a = (/^\*/ && ! /value=/))) && ! $a'
于 2012-08-05T07:02:37.363 に答える