Let's rewrite your regular expression with the (?x) flag and comment it shall we?
That gives us
qr{(?smx)
\.? # Match the first instance of 0 or 1 one periods
( # then capture
\S+ # one or more non whitespace characters
)
}
So, if we follow that recipe on the string
human.NT_113898, the matcher looks at the start of the string, sees that the test for
0 or 1 periods succeeds there, so it scarfs up the rest of the string into
$1. Which isn't what you wanted.
What you
actually want depends a little on what you're expecting as input. Assuming that there's always going to be at least one period in the input string, something like
qr{(?smx)
\. # Find a full stop
(.*) # and capture everything after it
}
will do. However, f there's the possibility of there not being a period, you might have to do
qr{(?smx)
^ # From the beginning
(?: # In a group...
[^.]* # Match any character except period, any number of times
\. # followed by a period
)? # math the group 0 or 1 times
(.*) # then capture everything else
}
If there's a trick to understanding why a regular expression doesn't do what you want, it's to break it down like this and go through each subexpression and explain to yourself what it's trying to match. Most of the time this narrative approach will lead you to your bug and to its fix remarkably quickly.