2016-05-10 5 views
0

私は、行を配列にすることでファイルを開きます。重複した値を含む正規表現に基づいて、このファイルの内部にあります。正規表現が一致する場合は、それを数えたいと思います。正規表現は次のようになります $b =~ /\/([^\/]+)@@/私は$1値と一致したい。perl count line in double looping、正規表現に1を加えた場合+1

my @array = do 
{ 
    open my $FH, '<', 'abc.txt' or die 'unable to open the file\n'; 
    <$FH>; 
}; 

以下は私のやり方です。ファイル内に同じ行が表示されます。助けてくれてありがとう。以下は

foreach my $b (@array) 
{ 
    $conflictTemp = 0; 
    $b =~ /\/([^\/]+)@@/; 
    $b = $1; 
    #print "$b\n"; 
    foreach my $c (@array) 
    { 
     $c =~ /\/([^\/]+)@@/; 
     $c = $1; 

     if($b eq $c) 
     { 
      $conflictTemp ++; 
      #print "$b , $c \n" 
      #if($conflictTemp > 1) 
      #{ 
      # $conflict ++; 
      #} 
     } 
    } 
} 

いくつかのサンプルデータであり、2つの文が重複

/a/b/c/d/code/Debug/atlantis_digital/c/d/code/Debug/[email protected]@/main/place.09/2 

/a/b/c/d/code/[email protected]@/main/place.09/0 

/a/b/c/d/code/.settings/[email protected]@/main/4 

/a/b/c/d/code/[email protected]@/main/2 

/a/b/c/d/code/[email protected]@/main/CSS5/5 

/a/b/c/d/code/[email protected]@/main/CSS5/10 

/a/b/c/d/code/[email protected]@/main/place.09/0 

/a/b/c/d/code/[email protected]@/main/place.09/0 

/a/b/c/d/code/[email protected]@/main/2 

/a/b/c/d/code/.**[email protected]@**/main/CSS5/2 

/a/b/c/d/code/.**[email protected]@**/main/CSS5/2 

/a/b/c/d/code/[email protected]@/main/CSS5/3 
+0

を有効にするには、いくつかのサンプルデータと所望の出力は答えることがこの質問が容易になります。また、単一のchar変数名は厄介です。 – Sobrique

+0

配列の各要素を繰り返し処理し、パターンマッチでいくつかのデータを選択してから、累積回数を数えようとしているようです。あれは正しいですか? – Sobrique

+0

はい私はパターンに基づいてこれを達成しようとしています。 – Mike

答えて

0

ているあなたは、配列の各要素を反復パターンマッチを経由して、いくつかのデータを選択し、カウントしようとしているようです死ぬ。あれは正しいですか?

それはに簡単にではないでしょう。(例えば、重複があります)1以上のものを持っている変数については、

my %count_of; 
while (<$FH>) { 
    my ( $val) = /\/([^\/]+)@@/; 
    $count_of{$val}++; 
} 

そして:また

print join "\n", grep { $count_of{$_} > 1 } keys %count_of; 

、あなただけなら「スポットを捨てて」再生したい:

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

my %seen; 
my $match = qr/\/([^\/]+)@@/; 
while (<DATA>) { 
    my ($value) = m/$match/ or next; 
    print if $seen{$value}++; 
} 

__DATA__ 
/a/b/c/d/code/Debug/atlantis_digital/c/d/code/Debug/[email protected]@/main/place.09/2 
/a/b/c/d/code/C5537_mem_map.cm[email protected]@/main/place.09/0 
/a/b/c/d/code/.settings/[email protected]@/main/4 
/a/b/c/d/code/[email protected]@/main/2 
/a/b/c/d/code/[email protected]@/main/CSS5/5 
/a/b/c/d/code/[email protected]@/main/CSS5/10 
/a/b/c/d/code/[email protected]@/main/place.09/0 
/a/b/c/d/code/[email protected]@/main/place.09/0 
/a/b/c/d/code/[email protected]@/main/2 
/a/b/c/d/code/[email protected]@/main/CSS5/2 
/a/b/c/d/code/[email protected]@/main/CSS5/2 
/a/b/c/d/code/[email protected]@/main/CSS5/3 
+0

project2.plのハッシュ要素に初期化されていないcalue $ valを使用すると、<$FH>のようになります。このエラーは平均です – Mike

+0

あなたは、 tマッチ。マッチの後に 'または'を追加します(コードが編集されました)。 – Sobrique

+0

thx、私のファイルにはスペースが含まれていると思います。これが簡単な方法かもしれません。 変数myの前になぜ% – Mike

0

問題は以前の回答で解決されました - 私はただオフにしたいそれは別の味です。正規表現

  • アウト

    • 呪文は、パターンが最初に表示された行を記録するために%seenハッシュを使用します。
    • もう少し詳細なレポート

    use v5.12; 
    use warnings; 
    
    my $regex = qr/ 
           \/    # A literal slash followed by 
           (    # Capture to $1 ... 
            [^\/]+  # ... anything that's not a slash 
           )    # close capture to $1 
           @@    # Must be immdiately followed by literal @@ 
          /x; 
    
    my %line_num ; 
    while (<>) { 
        next unless /$regex/ ; 
        my $pattern = $1 ; 
        if ($line_num{ $pattern }) { 
         say "'$pattern' appears on lines ", $line_num{ $pattern }, " and $." ; 
         next ; 
        } 
        $line_num{ $pattern } = $. ; # Record the line number 
    } 
    
    # Ran on data above will produce; 
    # '.cdtproject' appears on lines 7 and 8 
    # '.cdtbuild' appears on lines 10 and 11 
    
  • +0

    私は同じ行を数えるために私のリストを通して二重ループループを使用する方法を知っているかもしれません – Mike

    +0

    私はあなたが何を求めているのか分かりませんが、その方法を実行するならば、スクリプトはSTDINを読み、STDOUT 'in.txt'という名前のファイルにあり、' same.pl'という名前のスクリプトは './same.pl in.txt'や' cat in.txt | 。/ same.pl' – Marty