Perl lexer:为什么在<=> <=> <=>的上下文中"<=>"eq"="?

Eva*_*oll 12 perl constants spaceship-operator

我只是在阅读秘密伪常数,即太空舰队常数

<=><=><=>   Space fleet                 0
Run Code Online (Sandbox Code Playgroud)

这似乎是因为外面<=>正在做一些我不理解的事情.我的问题是为什么

my $foo = <=>;
Run Code Online (Sandbox Code Playgroud)

设置$foo=?其他非字母数字似乎也有用,

my $foo = <=>;
my $foo = <->;
my $foo = </>;
Run Code Online (Sandbox Code Playgroud)

但是,字母数字不会......

my $foo = <a>;
Run Code Online (Sandbox Code Playgroud)

此外,perlsecret吊舱是混乱给我,

虽然它看起来像是三个宇宙飞船运营商的序列,但只有中型舰才是真正的宇宙飞船.两个外部的"宇宙飞船"实际上是召唤的glob("=").

它似乎也不是这样,因为我无法理解为什么glob("=")会返回=,但glob("a")会返回undef- 即使a在当前工作目录中有一个文件被调用.

Perl在这两种情况下做了什么?如果内部的东西<>不是字母数字,我认为它会回落到文字中- 是否支持这种行为?

ike*_*ami 9

在需要表达式的地方,Perl会选择以下第一个适用的表达式:

如果需要中缀或后缀运算符,Perl会选择适用的以下第一个:

  • <=>数值比较运算符.
  • <= 否则是数值小于或等于运算符.
  • << 是班次运营商.
  • < 否则是数值小于运算符.

(最后三个可能与此不相关.我添加它们以涵盖所有内容<.)

所以,


Сух*_*й27 6

如有疑问,请查看-MO=Deparse:

$ perl -MO=Deparse -e '$foo = <=>'

use File::Glob ();
$foo = glob('=');
Run Code Online (Sandbox Code Playgroud)

Spacefleet给出0,因为两个操作数<=>是相等的,

perl -MO=Deparse -e '$foo = <=><=><=>'

use File::Glob ();
$foo = glob('=') <=> glob('=');
Run Code Online (Sandbox Code Playgroud)


dus*_*uff 5

my $foo = <=>;
my $foo = <->;
my $foo = </>;
Run Code Online (Sandbox Code Playgroud)

这些都被解释为使用glob.由于参数中没有*,?[…]构造,它们会扩展到传入的文本.

my $foo = <a>;
Run Code Online (Sandbox Code Playgroud)

这被解释为从名为的文件句柄中读取一行a.

无论如何.<=><=><=>表现得像glob("=") <=> glob("=").由于双方评估"=",他们是相等的,比较返回0.


Eva*_*oll 2

我想我明白发生了什么事

glob("*asdf*");
Run Code Online (Sandbox Code Playgroud)

将仅返回名称中包含该字符串的文件,asdf因为元字符扩展测试文件是否存在。然而,

glob("asdf");
Run Code Online (Sandbox Code Playgroud)

无论文件的状态如何,都将始终返回。asdf通过扩展,<=>缺少元字符也将返回'='