簡體   English   中英

如果匹配正則表達式加1,則在雙循環中執行perl count行

[英]perl count line in double looping, if match regular expression plus 1

我通過將行放入數組來打開文件。 在此文件中,基於包含重復值的正則表達式。 如果正則表達式是匹配項,我想將其計算在內。 正則表達式可能類似於$b =~ /\\/([^\\/]+)@@/ 我想匹配$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 ++;
            #}
        }
    }
}

以下是一些示例數據,兩個句子是重復的

/a/b/c/d/code/Debug/atlantis_digital/c/d/code/Debug/atlantis_digital.map@@/main/place.09/2

/a/b/c/d/code/C5537_mem_map.cmd@@/main/place.09/0

/a/b/c/d/code/.settings/org.eclipse.cdt.managedbuilder.core.prefs@@/main/4

/a/b/c/d/code/.project_initial@@/main/2

/a/b/c/d/code/.project@@/main/CSS5/5

/a/b/c/d/code/.cproject@@/main/CSS5/10

/a/b/c/d/code/.cdtproject@@/main/place.09/0

/a/b/c/d/code/.cdtproject@@/main/place.09/0

/a/b/c/d/code/.cdtbuild_initial@@/main/2

/a/b/c/d/code/.**cdtbuild@@**/main/CSS5/2

/a/b/c/d/code/.**cdtbuild@@**/main/CSS5/2

/a/b/c/d/code/.ccsproject@@/main/CSS5/3

看來您要遍歷數組的每個元素,通過模式匹配選擇一些數據,然后計算重復數。 那是對的嗎?

會不會更容易:

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/atlantis_digital.map@@/main/place.09/2
/a/b/c/d/code/C5537_mem_map.cmd@@/main/place.09/0
/a/b/c/d/code/.settings/org.eclipse.cdt.managedbuilder.core.prefs@@/main/4
/a/b/c/d/code/.project_initial@@/main/2
/a/b/c/d/code/.project@@/main/CSS5/5
/a/b/c/d/code/.cproject@@/main/CSS5/10
/a/b/c/d/code/.cdtproject@@/main/place.09/0
/a/b/c/d/code/.cdtproject@@/main/place.09/0
/a/b/c/d/code/.cdtbuild_initial@@/main/2
/a/b/c/d/code/.cdtbuild@@/main/CSS5/2
/a/b/c/d/code/.cdtbuild@@/main/CSS5/2
/a/b/c/d/code/.ccsproject@@/main/CSS5/3

先前的答案已經解決了這個問題-我只想提供一種替代的味道;

  • 闡明正則表達式
  • 使用%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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM