InfiniteSilence has asked for the wisdom of the Perl Monks concerning the following question:

So I am looking around in perlvar and I learn that if you preface a scalar variable name with an underscore it will by default be in the main package...wow, I think. I want to try that:

perl -e 'package Nether; our $val = 2000; my $_nonesuch = 3000; packa +ge main; print __PACKAGE__ . qq~\t~ . $main::_nonesuch;'

Makes: main

What? ...what happened by my value? So I take away the package portion:

perl -e 'package Nether; our $val = 2000; my $_nonesuch = 3000; packa +ge main; print __PACKAGE__ . qq~\t~ . $_nonesuch;'

main 3000

As an aside I should mention why I keep posting these cryptic things about basic Perl functionality. I am researching why people run into problems with Perl and give up. The target audience (for now) includes project management and product owners who have enough familiarity with the language to recommend its use but want to simultaneously reduce the backlash that might come from doing so.

Celebrate Intellectual Diversity

Replies are listed 'Best First'.
Re: Underscore in scalar name not in main package
by choroba (Cardinal) on May 08, 2026 at 20:23 UTC
    You probably missed the caret symbol. Here is the relevant passage from perlvar:

    In particular, the special ${^_XYZ} variables are always taken to be in package main, regardless of any package declarations presently in scope.

    Note that this paragraph should be read as the last paragraph of the whole section "The Syntax of Variable Names ", as it provides additional information to important details in the preceding text. It definitely doesn't mean "If you want to introduce a global variable without a declaration, start its name with ^_!".

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
      Hmm ... I've never seen anyone introducing ${^_globals} in his code.

      Probably because it's much easier and clearer to just use a namespace for $MyApp::globals ...

      But well this might be useful for machine translations, that's also why JS originally allowed the $ symbol anywhere in variable identifiers.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      see Wikisyntax for the Monastery

Re: Underscore in scalar name not in main package
by dave_the_m (Monsignor) on May 08, 2026 at 20:02 UTC
    if you preface a scalar variable name with an underscore it will by default be in the main
    I'm pretty sure it doesn't say that anywhere in perlvar. I think you've misread or misunderstood something. What is the exact text?

    Dave.

Re: Underscore in scalar name not in main package
by jwkrahn (Abbot) on May 08, 2026 at 21:02 UTC
    if you preface a scalar variable name with an underscore it will by default be in the main package

    If you preface a variable name with an apostrophe ($'var) or two colons ($::var) it WILL be in the main package.

    Naked blocks are fun! -- Randal L. Schwartz, Perl hacker
Re: Underscore in scalar name not in main package
by LanX (Saint) on May 09, 2026 at 11:12 UTC
    > I am researching why people run into problems with Perl and give up.

    You should probably start a new thread for this.

    My number one guess of frustration would be (de)referencing rules with sigils.

    (The deeper reason is the transition from Perl4 to 5 and trying to piggy back new features while retaining almost full compatibility)

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery