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]
| [reply] [d/l] |
|
|
> as $_ without quotes is the shell variable which contains the last argument of the last command
Similar to ALT-. which is introducing the last argument verbatim.
But what I was really longing for is a variable or hotkey producing the last output , alas this doesn't exist.
The closest I could find now is `!!` , I.e. to backtick the last command.
But I'd really love to facilitate this be defining a shortcut introducing `!!` ...
So I figured out bind '"\e,":"`!!`"' (ESC for ALT) which also works well on termux.
Put it into your bashrc and it'll help you to incrementally build one liners.
Dumb example:
$ bind '"\e,":"`!!`"'
$ ls *re.pl
tst_re.pl
$ echo `!!` # typed "echo ALT-,"
echo `ls *re.pl` # expanded history entry
tst_re.pl
$
Update
This will nest better when used repeatedly
$ bind '"\e,":"$(!!)"'
| [reply] [d/l] [select] |
|
|
$_ without quotes is the shell variable which contains the last argument of the last command.
🤦
| [reply] |
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.
| [reply] [d/l] [select] |
|
|
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
| [reply] [d/l] |
|
|
>
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
| [reply] [d/l] [select] |
|
|
|
|
|
|
|
|
|
%_ 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.
- 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.
| [reply] [d/l] [select] |
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.
| [reply] [d/l] [select] |