in reply to can i get a matched values as an array

This can be done by capturing a match to an array:
>perl -wMstrict -le "my $s = 'age 23 name john'; my @an = $s =~ m{ age \s+ (\d+) \s+ name \s+ ([a-z]+) }xms; print qq{@an}; " 23 john
Note that if there is an overall match, each capturing group of the regex will return something to the array even if that particular group was not a part of the overall match:
>perl -wMstrict -le "my $s = 'age 23 name john'; my @an = $s =~ m{ name \s+ ([a-z]+) | address \s+ (\d+) }xms; my $captured = join ':', @an; print qq{:$captured:}; " Use of uninitialized value in join or string at -e line 1. :john::
The values from unmatched capture groups are undefined and can be detected and filtered:
>perl -wMstrict -le "my $s = 'age 23 name john'; my @an = $s =~ m{ name \s+ ([a-z]+) | address \s+ (\d+) }xms; defined or $_ = 'UNdefined' for @an; my $captured = join ':', @an; print qq{:$captured:}; " :john:UNdefined:
See perlop, the section on Regexp Quote Like Operators, subsection on the m/PATTERN/msixpogc operator, about the seventh paragraph in.

Note: in Perl 5.10, this can also be done with named capture buffers.
Look for (?<NAME>pattern) in perlre Extended Patterns.

Updates:

  1. Added reference links.
  2. Added note re: named capture buffers.