In scalar context, the match op would return a value indicating whether the match was successful or not. That's useless to you since the pattern will always match. In list context, the match operator returns a list of a all the captures.
The parens around $maid are necessary to select the list assignment operator which places the match operator in list context.
lomSpace, Beyond your question, you seem to be doing some odd stuff.
When you say my @maid_id = split(/_/, $komp_dir);, do you really mean to split $komp_dir? That variable is unchanging within both loops, and so should certainly not be reprocessed with every pass. Ditto for the other variables in the nested loop.
The next line has another problem: my $maid = $fields[0]; Don't you mean my $maid = $maid_id[0];?
Your braces in ${maid} are unnecessary and inconsistent with, say, $count.
$ perl -e'my ($maid = $fields[0]) =~ /(^\d*)/;'
Can't declare scalar assignment in "my" at -e line 1, near ") =~"
Execution of -e aborted due to compilation errors.