in reply to Grep 1st word of strings in array

You have probably misunderstood where the results of a regular expression match end up.

In your case, the contents of $line do NOT change, after a RE match attempt.

If successful, the match results put all captured data into $1, $2 .. etc.

So, instead of pushing $line, try

if ($line =~/^>(\w+)\s(.+)$/) { push(@seqnames, $1);
Alternatively, you could do something like:
if (my ($firstword,$rest_of_it) = $line =~/^>(\w+)\s(.+)$/) { push @segnames,$firstword;
which is more readable, IMHO. Note the use of "my" with (parens), to provide a LIST context for the match results.

Update:I just noticed from your commentd 'grep' that you apparently expect the results of the RE inside 'grep' to be placed in the results.
This is not the case. To achieve that, you should use 'map' - which TRANSFORMS data. 'grep' merely FILTERS data.

P.S. Welcome to the monastery.

             All great truths begin as blasphemies.
                   ― George Bernard Shaw, writer, Nobel laureate (1856-1950)