2016-10-07 10 views
1
sub get_info() { 

    open(FILE,"file.txt") or die "Could not open file"; 
    my @list = grep /\bWarning\b/, <FILE>; 
    $count = 0; 
    chomp @list; 
    $list[$count] =~ s/^\S+\s*//; 
    #do something; 
    $count++; 
} 

file.txt - 
Warning: New layer 256 is added 
Warning: Layer deleted 
Warning: New layer 301 is added 

すべての行から「警告」という単語を無視します。perlでファイルからグリッピングしながら行の最初の単語を無視する方法は?

しかし、「警告」という言葉は最初の文からだけ隠しています。

私は$ countを正しくインクリメントしていますか?

+0

ループが必要だと思いますか? – Sundeep

答えて

2

$count=0の交換を行っているためです。したがって、最初のインデックスのみが変更されています。

$list[$count] =~ s/^\S+\s*//g; 

ループを使用していないので、countは意味をなさないものです。

ソリューション:

#!/usr/bin/perl 
use strict; 
use warnings; 

sub get_info{  
    open(FILE,"file.txt") or die "Could not open file"; 
    my @list = grep /\bWarning\b/, <FILE>; 
    my $count = 0; 
    foreach (@list) { 
     $list[$count] =~ s/^\S+\s*//g; 
     $count++; 
    } 
    print @list; 
    #do something; 
} 

get_info(); 

出力:

New layer 256 is added 
Layer deleted 
New layer 301 is added 

改良:使用される3つの引数オープン、削除のgrepと置き換える検索、行毎にファイルを読み込むためにwhileループを追加

#!/usr/bin/perl 
use strict; 
use warnings; 

my @list; 
sub get_info{ 
    open(my $fh, "<", "file.txt") or die "Could not open file: $!"; 
    while(<$fh>){ 
     chomp; 
     if (/^Warning:(.*)/){ 
      push @list, $1; 
     } 
    } 
    print @list; 
    #do something; 
} 

get_info(); 
+0

ありがとうChankey。/ –

+3

または単に '@list = map {s/^警告://} grep/\ bWarning \ b/' – tripleee

+0

@トリプルリー、あなたは 'grep' argの後にカンマが必要だと思うし、その 's /// r'に' r'を付けるか、 '$ _'文字列ではなく、置換の数を返します。 – Ashley

関連する問題