in reply to Re: perldoc -lf anomaly
in thread perldoc -lf anomaly

returns perlfunc and perlop regardless of what "whatever" is.

$ perldoc -lf anomaly
/home/choroba/localperl/lib/5.43.9/pod/perlfunc.pod
/home/choroba/localperl/lib/5.43.9/pod/perlop.pod

Thanks for looking into it choroba. These results clearly contradict the perldoc documentation:

perldoc perldoc (and man perldoc) says:
-l   Display only the file name of the module found.

perldoc --help says:
-l   Display the module's file name
Here's another anomaly:
% perldoc -lf splice    
/Users/u/perl5/perlbrew/perls/perl-5.42.0/lib/5.42.0/pods/perlfunc.pod
/Users/u/perl5/perlbrew/perls/perl-5.42.0/lib/5.42.0/pods/perlop.pod

% perldoc $_        
No documentation found for "splice".

% perldoc -v $_
'splice' does not look like a Perl variable

% perldoc -v '$_'
$_      The default input and pattern-searching space...
And another one:
% perldoc -v '$_'
$_      The default input and pattern-searching space...

% perldoc -v '@_' 
@_      Within a subroutine the array @_ contains the parameters...

% perldoc -v '%_'
No documentation for perl variable '%_' found

Replies are listed 'Best First'.
Re^3: perldoc -lf anomaly
by choroba (Cardinal) on May 07, 2026 at 22:13 UTC
    I'm not sure about the "another anomaly". You get the documentation of splice for $_, as $_ without quotes is the shell variable which contains the last argument of the last command.

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
      $_ without quotes is the shell variable which contains the last argument of the last command.

      🤦

Re^3: perldoc -lf anomaly
by ikegami (Patriarch) on May 08, 2026 at 06:09 UTC

    These results clearly contradict the perldoc documentation:

    That's not true. The docs don't say what happens if you use -l with -f func instead of a module.

    Here's another anomaly

    What do you think is anomalous? That it's looking up splice instead of $_? That's your error. You interpolated shell variable $_ into your shell command, and it apparently had the value splice.

    And another one:

    What do you think is anomalous? That output is correct too, and I have no idea what you think is wrong.

      Ok I was confused about -lf (and -lv and -lq) and my $_ anomaly is pure facepalm. But what about this:
      % perldoc -v '%_'
      No documentation for perl variable '%_' found
      
      %_ is a special snowflake like $_ and @_ in that they can be used under strict without declaration and they all fail in the same way if you try to own them with my: Can't use global %_ in "my" (but our and local work on all of them). I like using it sometimes in one-liners and dirty scripts cause $_{$_} looks weird and cool and it works good and I like typing it! Anyway I made Claude Haiku 4.5 at duck.ai think about %_ for 36 seconds! I've never seen the robots get so confused. They insist it doesn't exist, or it's nothing special, or that it's a filehandle or a reference to the last call to stat lol:
      perl -Mstrict -Mwarnings -le '%_ = ( foo => 1, bar => 2 ); print "$_ = + $_{$_}" for keys %_'
      foo = 1
      bar = 2
      
      So why isn't it documented? I could swear I saw it somewhere once upon a time, or maybe not... What is it??? Thanks
        > So why isn't it documented?

        Because contrary to $_ and @_ it has no function

        > I could swear I saw it somewhere once upon a time, or maybe not...

        People are exploiting the side effect that it's a global and doesn't need to be declared.

        > What is it???

        The typeglob / symbol _ is global to allow the scalar and array slots $_ and @_ to hold magic.

        The hash slot is undefined but still global and can be (ab)used for syntactic sugar.

        Like

        # No my/our %_ lives in main:: %_ = (a => 1, b => 2); # global variable in package main

        See also this SO discussion https://stackoverflow.com/questions/36723739/undocumented-perl-variable#36724370

        Edit

        perldoc -v and perlvar should probably be expanded to show a generic explanation for such "reserved" special variables

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

        %_ is a special snowflake like $_ and @_

        If by special snowflake you mean a punctuation variable, then yes.

        Yes, %_ is an invalid names for a lexical, but that's the case for all punctuation variables.

        Yes, %_ is strict-exempt, but that's the case for all super-global variables, and all punctuation variables are super-global variables.[1]

        So there's nothing special about %_ specifically, so it makes no sense to document %_ specifically any more than it does to document $x. It works just like every other variable of its class.

        I could swear I saw it somewhere once upon a time

        Perl has never used %_. Its existence is a side effect of how super-globals are implemented: Symbols are made super-global, not individual variables. This means that $ENV, @2, %$ and &_ all similarly exist as super-global variables.


        1. All package variables are visible everywhere, making them all globals. By super-global, I mean that an unqualified reference to this variable looks for the symbol in `main` instead of the current package, so all unqualified references access the same variable regardless of the current package.
Re^3: perldoc -lf anomaly
by ikegami (Patriarch) on May 08, 2026 at 06:14 UTC

    These results clearly contradict the perldoc documentation:

    That's not true. The docs don't say what happens if you use -l with -f func instead of a module.

    Here's another anomaly

    What do you think is anomalous? That it's looking up splice instead of $_? That's your error. You interpolated shell variable $_ into your shell command, and it apparently had the value splice.

    And another one:

    What do you think is anomalous? That output is correct too, and I have no idea what you think is wrong.