To expand upon the AnonMonk's suggestion.
Maybe this helps to show what is going on?
my $string = "Twinkle twinkle little star";
my @matches = $string =~ m/twinkle/ig;
print "Matches are: @matches\n"; # Matches are: Twinkle twinkle
print "Number of matches: ",scalar @matches,"\n";
# this is the same without creating @matches
# the () is a list and $n here is number of things
# in that list
# Without the intervening ()=, to force list context,
# you just get the "truthfulness" (0,1) of the match
# with this, you get the number of things in the list
# without having to create a named array (@matches)
my $n = () = $string =~ m/twinkle/ig;
print "Number of occurences = $n\n";
Matches are: Twinkle twinkle
Number of matches: 2
Number of occurences = 2
PS: I try to avoid assigning to $_ when possible (and sometimes this is necessary), but I figure that $_ "belongs to Perl". The expression:
s/^\s*//; #delete leading spaces
s/\s*$//; #delete trailing spaces
is seen often and has this effect of assigning $string to $_. $string gets modified due to "aliasing".