2017-07-29 61 views
-2

如何設置$counter++哈希除非是1?在此代碼: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

如果你只想增加,除非滿足一些條件, 你應該在你的代碼中提到。

使用後綴foo() unless condition();語法意味着條件只會引用前面的語句,而不是整個範圍(這可能是瘋狂的解析)。

所以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++只應每一次做域名,如print,這意味着你可以簡單地移動$count++unless的身體。

或者,您也可以通過使用

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;