in reply to Regex - Is there any way to control when the contents of a variable are interpolated? (Using "$1" and '$1' in regex replacements)

Several problems here:
  1. Array indexing starts at 0, not 1.
  2. In character classes (inside square brackets in a regex) you do not have to backslash brackets. ^ on the non-first position in a character class stands for itself.
  3. There are no capturing parentheses in the code, so $1 would be empty even if it worked.
  4. You have to evaluate the right hand side to turn the string $1 into the variable.

#!/usr/bin/perl use warnings; use strict; sub replace { s/$_[0]/$_[1]/eeg; } $_ = 'a { b } c ( d ) e'; my $nobrackets = qr/[^{}]+/; replace(qr/\{($nobrackets)\}/, '$1'); print "$_\n";
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
  • Comment on Re: Regex - Is there any way to control when the contents of a variable are interpolated? (Using "$1" and '$1' in regex replacements)
  • Select or Download Code

Replies are listed 'Best First'.
Re^2: Regex - Is there any way to control when the contents of a variable are interpolated? (Using "$1" and '$1' in regex replacements)
by JDoolin (Novice) on Mar 14, 2014 at 17:12 UTC
    Hello, thank you for your prompt response. It appears that s///eeg gives me part of what I want. It seems to interpolate the $1 when it is alone. But it is an incomplete solution for me. If instead of just getting rid of the brackets I want to replace them with words:
    #!/usr/bin/perl use warnings; use strict; sub replace { s/$_[0]/$_[1]/eeg; } $_ = 'a { b } c ( d ) e'; my $nobrackets = qr/[^\{^\}]+/; replace(qr/\{($nobrackets)\}/, ' leftbracket $1 rightbracket '); # I w +ant to replace the brackets with the words leftbracket and rightbrack +et. print "$_\n";
    This appears to make the { b } vanish entirely.

        Yes, I misunderstood his comment above.

        "2. In character classes (inside square brackets in a regex) you do not have to backslash brackets. ^ on the non-first position in a character class stands for itself."

        When I read 'you do not have to...' I understood that the backslashes are optional, but decided I liked to use them anyway. I completely missed his more important point here, that the repeated ^ actually negates the ^ character.