static SS matchDollarVarsIC_underscores(S pat, S s) { if (pat == null || s == null) null; new L vars; S pat2 = dollarVarsToStars_underscores(pat, vars); new Matches m; if (!match(pat2, s, m)) null; new SS map; int v = 0; for (int i = 0; i < l(m.m); ) { S var = vars.get(v++); bool quoted = startsWith(var, "$_q_"); if (quoted) { if (!isQuoted(value)) null; var = "$" + substring(var, 4); S value = unquote(m.m[i++]); if (!strictPutIC(map, var, value)) null; } else { int n = underscoreWordCount(var); S value = joinWithSpace(subStringArray(m.m, i, i+n)); if (!strictPutIC(map, var, value)) null; i += n; } } ret map; }