http://qs321.pair.com?node_id=253226

LogicalChaos has asked for the wisdom of the Perl Monks concerning the following question:

I'm hoping one (or more) of you can help me on my path to enlightment.

I'm trying to match a string and pull out the appropriate data. The string can be in one of three forms:
'3d', '3d 2h', '6h'.

What I have now (which works) is:
$value =~ /^(?:(?:(\d+)d)?\s*(?:(\d+)h){1})|(?:(?:(\d+)d){1}\s*(?:(\d+)h)?)$/i; my $day = $1 || $3 || 0; my $hour = $2 || $4 || 0;
But it's rather of painful to look at. What alternatives exist? I suspect there is a way to only specify each match once, and not use '|', but...

If it makes any difference, this is running on ActiveState 5.6.0 (build 616)