in reply to Regex shows only last match multiple times?

You can make your code rather more simpler and hence, easier to read:

Initialise $count to zero

my $count = 0;

...or, even more simply

my $count;

Then you don't need that perverse

$count = $count - 1;

statement. And even if you did want it, what's wrong with


(always bearing in mind the old TIMTOWTDI acronym of course!)

The next simplification, if the file really does consist of just one line, is to slurp it in, in one hit

@array = <$fh>; # Reads all lines into array $singleLine = <$fh>; # reads one line only

Finally, and this is where I think your question might get answered, you can capture regex hits to an array and then simply count the array...

my @count = $w =~ /$x/g; my $total = @count;

With no loops making it look more complicated than it is, you can then start to pin down what is going on here. Perhaps use some test data/test regex to give a simpler starting block. I would also be suspicious of perl being greedy in that there regex. But first, create some test data and make sure you can "prove" your code before hitting the real data.

Replies are listed 'Best First'.
Re^2: Regex shows only last match multiple times?
by GertMT (Hermit) on Feb 13, 2014 at 10:47 UTC
    changed a few more things indeed and it now works as expected
Re^2: Regex shows only last match multiple times?
by Anonymous Monk on Aug 08, 2014 at 13:41 UTC
    how to exit the loop after complete 3 rounds...?? it means... if you enter 3 times wrong input it should exit from the program... here i am providing code please modify it
    #!/user/bin/perl print"enter the rang of array:\n"; chomp($c=<STDIN>); while($i=1){ print"while loop round:$i\n"; if($i>3){ exit; } if($c =~ /^\[|[a-z,A-Z]+/){ print "it is invalid please enter digits\n"; #print"enter the rang of array:\n"; #chomp($c=<STDIN>); } elsif($c =~ /^[1-9]+/){ print "you are entered correct input\n"; last; } $i++; } @a=(); $b; $1; print"Enter the array:\n"; for($i=0;$i<$c;$i++){ chomp($b=<STDIN>); $a[$i]=$b; } #for($i=0;$i<@a;$i++){ #print"the array $a[$i]\n"; #} #print"the PSI ID's:"; foreach $val(@a){ #print"####$val###\n"; if($val=~ /^([a-z]+)\s?PSI\-ID\-?(\d+)/){ print"value=$2\n"; push(@b,$1); push(@c,$2); } } print"the pax id's with PSI:\n"; for($i=0;$i<=@b;$i++){ for($j=0;$j<=@c;$j++){ if($i==$j){ print"$b[$i] $c[$j]\n"; } } }

      If you add use warnings; to the head of your script, Perl will tell you that the opening of the while loop:

      while ($i = 1) {

      contains a logic error: it re-initialises the variable to 1 on each loop iteration. In fact, this loop would benefit from a complete re-write:

      use strict; use warnings; my $c; for (my ($valid, $try) = (0, 1); !$valid; ++$try) { print "Enter the range of the array (try $try):\n"; chomp($c = <STDIN>); if ($c =~ /^\d+$/) { print "You have entered a valid range: $c\n"; $valid = 1; } elsif ($try < 3) { print "The input is invalid, please enter digits only\n"; } else { print "No valid array range entered, exiting\n"; exit; } } print "Continuing...\n";

      This is one of the unusual cases in which a C-style for loop is useful in Perl. Please note:

      • I have also added use strict; and declared all variables as lexicals with my. The amount of time this will save you down the track far outweighs the (very small) extra effort required.
      • In future, please put <code> ... </code> tags around your code, to make it readable.
      • When asking a question (as opposed to commenting on someone else’s answer), it’s usually better to open a new thread.

      Hope that helps,

      Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,