Perl 词法分析器:为什么 "<=>" eq "=" 在 <=>><=><=> 的上下文中?

Perl lexer: why does "<=>" eq "=" in the context of <=><=><=>?

我刚刚在读秘密伪常数,即 Space 舰队常数

<=><=><=>   Space fleet                 0

这好像是因为外面的<=>在做一些我不明白的事情。我的问题是为什么

my $foo = <=>;

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

my $foo = <=>;
my $foo = <->;
my $foo = </>;

但是,字母数字不...

my $foo = <a>;

此外,the perlsecret pod is confusing to me

Even though it looks like a sequence of three spaceship operators, only the middle ship is an actual spaceship. The two outer "spaceships" are actually calls to glob("=").

似乎也不是这样,因为我不明白为什么 glob("=") 会 return =,但是 glob("a")会 return undef -- 即使在当前工作目录中有一个名为 a 的文件。

Perl 在这两种情况下做了什么?如果 <> 中的内容不是字母数字,我假设它会退回到文字 - 支持这种行为吗?

my $foo = <=>;
my $foo = <->;
my $foo = </>;

这些都被解读为glob的用法。由于它们的参数中没有 *?[…] 结构,因此它们扩展为传入的文本。

my $foo = <a>;

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

总之。 <=><=><=> 表现得像 glob("=") <=> glob("=")。由于双方的计算结果为 "=",因此它们相等,并且比较 returns 0.

我想我明白发生了什么,

glob("*asdf*");

将 return 仅在其名称中包含字符串 asdf 的文件,因为元字符扩展测试 file-exists。然而,

glob("asdf");

始终returnasdf,无论文件的状态如何。通过扩展 <=> 缺少元字符也会 return '='.

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

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

  • <=> 就是 numerical comparison operator.
  • <= 否则是数值小于或等于运算符。
  • << 是移位运算符。
  • < 否则是数值小于运算符。

(最后三个在这里可能不相关。我添加它们是为了涵盖以 < 开头的所有内容。)

所以,

  • <=><=><=>
    

    的缩写
    glob(qq<=>) <=> glob(qq<=>)
    

    可以这样写

    glob("=") <=> glob("=")
    

    "=" <=> "="
    

    因为没有特殊 glob 字符的 glob 模式只是 returns 模式。

    它警告 "isn't numeric" 两次并评估为零。

  • my $foo = <=>;
    

    的缩写
    my $foo = glob(qq<=>);
    

    可以这样写

    my $foo = glob("=");
    

    my $foo = "=";
    
  • my $foo = <a>;
    

    的缩写
    my $foo = readline(a);
    

    如果没有其他提及 *a,它会警告 "used only once: possible typo"。

    如果您之前没有将 a 作为文件句柄打开,它会警告 "on unopened filehandle"。

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

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

use File::Glob ();
$foo = glob('=');

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

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

use File::Glob ();
$foo = glob('=') <=> glob('=');