2017-07-29 18 views
-2

1以外の場合、$counter++をハッシュに設定するにはどうすればよいですか?このコードで:Perlがループで一致するカウンタを設定しました

use strict; 
    use warnings;  

    my @filestwo = glob("*.xml"); 
    my $result = @filestwo;   

    my $count = 0; 
    my %justone; 
    foreach my $domain (@filestwo) { 
     open my $in, '<', $domain or die "Open fail on $domain $!\n"; 
     my @linestwo = <$in>;   

      for my $line (@linestwo) { 

       if($line =~ /Domain:\s([a-z].+)/){ 
        $count++; 
        print "Number:$count Your TLD $1!\n" unless $justone{$1}++; 
       }     

      } 

} 

出力:

Number:1 Your TLD one.com! 
Number:3 Your TLD three.com! 
Number:5 Your TLD two.com! 

は次のようになります。

Number:1 Your TLD one.com! 
Number:2 Your TLD three.com! 
Number:3 Your TLD two.com! 

コードについての説明:

  • を開き、すべてのファイルには3つのファイル.xml(重複パターンあり)
  • マッチがパターン場合は、配列からハッシュ%justone;
  • 検索を作成します。ドメイン
  • 一致した場合と、次の反復の試合で再び同じパターンが、ちょうどunless $justone{$1}++;

私の問題で1を印刷、私はマッチリレーションシップのためだけにカウンタを設定することはできません。

答えて

1

条件が満たされない限りインクリメントしたい場合は、 をコードに記述する必要があります。

構文を使用すると、条件は、スコープ全体ではなく、前のステートメントのみを参照することになります(おそらく解析するのは難しいでしょう)。

従ってprint '...' unless $foounless($foo){ print '...'; }と同じです。

あなたがない限り、条件に複数の文を含めたい場合はこのように、あなたは中括弧を使用する必要があります。unless ($foo) { # as many lines as desired }

私が正しくあなたの質問を理解している場合、あなたがしたい:

unless ($justone{$1}++){ 
    $count++; 
    print "Number:$count Your TLD $1!\n" 
} 

これは、条件が満たされた場合にのみ増加し、目的の出力につながります。私は$ 1でキャプチャしたものに名前付き変数を使って読みやすくすることをお勧めします。

0

問題は$count++が唯一のあなたは、単にunlessの体に$count++を動かす可能性を意味し、printのようにドメインごとに一度行われるべきであるということです。

また、あなたは、次に何をしたい、次の出力

my %seen; 
my @uniq_domains = 
    grep !$seen{$_}++, 
     map /Domain:\s([a-z].+)/, 
     <$in>; 

または

use List::Util qw(uniq); 

my @uniq_domains = 
    uniq 
     map /Domain:\s([a-z].+)/, 
     <$in>; 

を使用して、コードを簡素化することができます:

say sprintf "%d. %s", $_+1, $uniq_domains[$_] 
    for 0..$#uniq_domains; 
関連する問題