Perl lexer:为什么在<=> <=> <=>的上下文中使用“ <=>” eq“ =”?

时间:2018-07-06 04:26:12

标签: perl constants spaceship-operator

我只是在读取秘密的伪常量,即太空舰队常量

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

这似乎是因为外部<=>正在执行我不了解的操作。我的问题是

为什么
my $foo = <=>;

$foo设置为=?其他非字母数字似乎也可以使用

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

但是,字母数字不...

my $foo = <a>;

此外,the perlsecret pod is confusing to me

  

即使看起来像是三个飞船操作员的序列,但只有中间飞船才是实际的飞船。实际上,两个外部“太空飞船”是对glob("=")的调用。

似乎也不是这样,因为我无法理解为什么glob("=")返回=,而glob("a")返回{{1} } –即使当前工作目录中有一个名为undef的文件。

在这两种情况下,Perl都在做什么?如果a中的内容不是字母数字,我认为它会退回到原义上,即是否支持该行为?

4 个答案:

答案 0 :(得分:9)

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

在期望使用infix或postfix运算符的地方,Perl选择以下适用的第一个:

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

所以

  • <=><=><=>
    

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

    可以写

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

    "=" <=> "="
    

    因为没有特殊glob字符的glob模式只会返回该模式。

    它两次警告“不是数字”,并求值为零。

  • my $foo = <=>;
    

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

    可以写

    my $foo = glob("=");
    

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

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

    如果没有其他提及*a,它会警告“仅使用一次:可能的错字”。

    如果您以前没有将a作为文件句柄打开,它会警告“未打开的文件句柄”。

答案 1 :(得分:6)

如有疑问,请与-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('=');

答案 2 :(得分:5)

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

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

my $foo = <a>;

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

无论如何。 <=><=><=>的行为类似于glob("=") <=> glob("=")。由于双方求和为"=",所以它们相等,并且比较返回0。

答案 3 :(得分:2)

我想我知道发生了什么事

glob("*asdf*");

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

glob("asdf");

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