#! perl -sw use strict; for ('6d', '3h', '4d 3h','6D', '3H', '4D 3H') { our ($d,$h) = (0,0); print "$d days $h hours\n" if m[^ (?: (\d+)d (?{ $d = $+ || '0' }) )? \s* (?: (\d+)h (?{ $h = $+ || '0' }) )? $]xi; } __END__ C:\test>test 6 days 0 hours 0 days 3 hours 4 days 3 hours