# contains a dollar sign, it had better be escaped, or it will be
# taken for a variable name prefix.
my %variables = ();
- my $variable_re = qr/\$(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/;
+ # Variable name syntax
+ 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;
my $expand_variables = sub {
my $value = '';
my $value_rest = shift;
if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
print STDERR
- "DEBUG[\$expand_variables] Parsed '$value_rest' into:\n"
+ "DEBUG[\$expand_variables] Parsed '$value_rest' ...\n"
}
while ($value_rest =~ /(?<!\\)${variable_re}/) {
- $value .= $`;
- $value .= $variables{$+{VARIABLE}};
$value_rest = $';
+ $value .= $`;
+
+ my $variable_value = $variables{$+{VARIABLE}};
+
+ # 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";
+ }
+ }
+
+ $value .= $variable_value;
}
if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
print STDERR
- "DEBUG[\$expand_variables] ... '$value$value_rest'\n";
+ "DEBUG[\$expand_variables] ... into: '$value$value_rest'\n";
}
return $value . $value_rest;
};
I<Variable assignment values are not tokenized.>
+Variable references can be one of:
+
+=over 4
+
+=item B<$>I<NAME> or B<${>I<NAME>B<}>
+
+Simple reference; the variable reference is replaced with its value,
+verbatim.
+
+=item B<${>I<NAME>B</>I<str>B</>I<subst>B<}>
+
+Substitution reference; the variable reference is replaced with its
+value, modified by replacing all occurences of I<str> with I<subst>.
+
+=back
+
=head2 Scope
Most of the statement values are accumulated globally from all the