12

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

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

这似乎是因为外部<=>正在做一些我不明白的事情。我的问题是为什么

my $foo = <=>;

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

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

但是,字母数字不...

my $foo = <a>;

此外,吊舱perlsecret让我感到困惑

尽管它看起来像是由三个飞船操作员组成的序列,但只有中间的飞船才是真正的飞船。两个外层的“宇宙飞船”实际上是对glob("=").

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

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

4

4 回答 4

9

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

在需要中缀或后缀运算符的地方,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的文件句柄”。

于 2018-07-06T06:20:51.247 回答
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('=');
于 2018-07-06T09:12:57.127 回答
5
my $foo = <=>;
my $foo = <->;
my $foo = </>;

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

my $foo = <a>;

这被解释为从名为a.

无论如何。<=><=><=>表现得像glob("=") <=> glob("="). 由于双方都评估为"=",因此它们相等,并且比较返回 0。

于 2018-07-06T04:36:02.093 回答
2

我想我明白发生了什么,

glob("*asdf*");

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

glob("asdf");

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

于 2018-07-06T04:54:06.017 回答