sub match { shift =~ m/ (?| (?: [^(]*\(([^)]*?)\) ) # Both parens. | (?: \((.*)$ ) # Left paren. | (?: ^(.*)\) ) # Right paren. | (?: ^[^()]*()$ ) # No parens (empty capture). ) /x; return $1 // (); }