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 会选择以下第一个适用的表达式:
<>
是 <ARGV>
的缩写
<<>>
是 <>
的 "safe" 版本(使用 3-arg open 而不是 2-arg open)
<<
否则是 here-doc operator. 的开始
<IDENTIFIER>
是 readline(IDENTIFIER)
的缩写
<...>
是 glob(qq<...>)
的缩写
在需要中缀或后缀运算符的地方,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('=');
我刚刚在读秘密伪常数,即 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 会选择以下第一个适用的表达式:
<>
是<ARGV>
的缩写
<<>>
是<>
的 "safe" 版本(使用 3-arg open 而不是 2-arg open)<<
否则是 here-doc operator. 的开始
<IDENTIFIER>
是readline(IDENTIFIER)
的缩写
<...>
是glob(qq<...>)
的缩写
在需要中缀或后缀运算符的地方,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('=');