my $variable_name_re = qr/(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/;
# Value modifier syntaxes
my $variable_subst_re = qr/\/(?P<RE>(?:\\\/|.)*?)\/(?P<SUBST>.*?)/;
- # Put it all together
- my $variable_re = qr/\$
- (?|
- # Simple case, just the name
- ${variable_name_re}
- |
- # Expressive case, with braces and possible
- # modifier expressions
- \{
- ${variable_name_re}
- (?:
- # Pile on modifier expressions,
- # separated by |
- ${variable_subst_re}
- )
- \}
- )/x;
+ # Variable reference
+ my $variable_simple_re = qr/(?<!\\)\$${variable_name_re}/;
+ my $variable_w_mod_re =
+ qr/(?<!\\)\$\{${variable_name_re}(?P<MOD>(?:\\\/|.)*?)\}/;
+ # Tie it all together
+ my $variable_re = qr/${variable_simple_re}|${variable_w_mod_re}/;
+
my $expand_variables = sub {
my $value = '';
my $value_rest = shift;
print STDERR
"DEBUG[\$expand_variables] Parsed '$value_rest' ...\n"
}
- while ($value_rest =~ /(?<!\\)${variable_re}/) {
- $value_rest = $';
- $value .= $`;
+ while ($value_rest =~ /${variable_re}/) {
+ # We must save important regexp values, because the next
+ # regexp clears them
+ my $mod = $+{MOD};
my $variable_value = $variables{$+{VARIABLE}};
+ $value_rest = $';
+ $value .= $`;
+
# Process modifier expressions, if present
- if (defined $+{RE}) {
- # We must save important %+ values, because the s///
- # below clears them
- my $re = $+{RE};
- my $subst = $+{SUBST};
-
- $variable_value =~ s/\Q$re\E/$subst/g;
-
- if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
- print STDERR
- "DEBUG[\$expand_variables] ... and substituted ",
- "'$re' with '$subst'\n";
+ if (defined $mod) {
+ if ($mod =~ /^${variable_subst_re}$/) {
+ my $re = $+{RE};
+ my $subst = $+{SUBST};
+
+ $variable_value =~ s/\Q$re\E/$subst/g;
+
+ if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
+ print STDERR
+ "DEBUG[\$expand_variables] ... and substituted ",
+ "'$re' with '$subst'\n";
+ }
}
}