Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 299353
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 12, 20262026-05-12T06:48:54+00:00 2026-05-12T06:48:54+00:00

I know that in a subroutine in Perl, it’s a very good idea to

  • 0

I know that in a subroutine in Perl, it’s a very good idea to preserve the “default variable” $_ with local before doing anything with it, in case the caller is using it, e.g.:

sub f() {
    local $_;              # Ensure $_ is restored on dynamic scope exit
    while (<$somefile>) {  # Clobbers $_, but that's OK -- it will be restored
        ...
    }
}

Now, often the reason you use $_ in the first place is because you want to use regexes, which may put results in handy “magic” variables like $1, $2 etc. I’d like to preserve those variables too, but I haven’t been able to find a way to do that.

All perlvar says is that @+ and @-, which $1 etc. seem to depend on internally, refer to the “last successful submatches in the currently active dynamic scope”. But even that seems at odds with my experiments. Empirically, the following code prints “aXaa” as I had hoped:

$_ = 'a';
/(.)/;          # Sets $1 to 'a'
print $1;       # Prints 'a'
{
    local $_;   # Preserve $_
    $_ = 'X';
    /(.)/;      # Sets $1 to 'X'
    print $1;   # Prints 'X'
}
print $_;       # Prints 'a' ('local' restored the earlier value of $_)
print $1;       # Prints 'a', suggesting localising $_ does localise $1 etc. too

But what I find truly surprising is that, in my ActivePerl 5.10.0 at least, commenting out the local line still preserves $1 — that is, the answer “aXXa” is produced! It appears that the lexical (not dynamic) scope of the brace-enclosed block is somehow preserving the value of $1.

So I find this situation confusing at best and would love to hear a definitive explanation. Mind you, I’d actually settle for a bulletproof way to preserve all regex-related magic variables without having to enumerate them all as in:

local @+, @-, $&, $1, $2, $3, $4, ...

which is clearly a disgusting hack. Until then, I will worry that any regex I touch will clobber something the caller was not expecting to be clobbered.

Thanks!

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-12T06:48:54+00:00Added an answer on May 12, 2026 at 6:48 am

    Maybe you can suggest a better wording for the documentation. Dynamic scope means everything up to the start of the enclosing block or subroutine, plus everything up to the start of that block or subroutine call, etc. except that any closed blocks are excluded.

    Another way to say it: “last successful submatches in the currently active dynamic scope” means there is implicitly a local $x=$x; at the start of each block for each variable.

    Most of the mentions of dynamic scope (for instance, http://perldoc.perl.org/perlglossary.html#scope or http://perldoc.perl.org/perlglossary.html#dynamic-scoping)
    are approaching it from the other way around. They apply if you think of a successful
    regex as implicitly doing a local $1, etc.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Sort of a fringy, non-practical question coming along here. You know that in Perl
I'm trying to write a subroutine in Perl that will delete a given node
I was always sure that if I pass a Perl subroutine a simple scalar,
I know that lot of questions about HTML sanitizers have appeared in SO, but
I know that all of these will be compiled together into one file but
I know that VB offers many things to control it : SDK, API, COM,
i know that it may be difficult to see the actual problem without looking
I know that a powerset is simply any number between 0 and 2^N-1 where
I know that when linking to multiple static libraries or object files, the order
I know that similar question was asked several times, but still I can't make

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.