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)
虽然它看起来像是三个宇宙飞船运营商的序列,但只有中型舰才是真正的宇宙飞船.两个外部的"宇宙飞船"实际上是召唤的
glob("=").
它似乎也不是这样,因为我无法理解为什么glob("=")会返回=,但glob("a")会返回undef- 即使a在当前工作目录中有一个文件被调用.
Perl在这两种情况下做了什么?如果内部的东西<>不是字母数字,我认为它会回落到文字中- 是否支持这种行为?
在需要表达式的地方,Perl会选择以下第一个适用的表达式:
<> 是的缩写 <ARGV><<>>是一个"安全"版本<>(使用3-arg打开而不是2-arg打开)<<否则是here-doc运算符的开头.<IDENTIFIER> 是的缩写 readline(IDENTIFIER)<...> 否则是短暂的 glob(qq<...>)如果需要中缀或后缀运算符,Perl会选择适用的以下第一个:
<=>是数值比较运算符.<= 否则是数值小于或等于运算符.<< 是班次运营商.< 否则是数值小于运算符.(最后三个可能与此不相关.我添加它们以涵盖所有内容<.)
所以,
<=><=><=>
Run Code Online (Sandbox Code Playgroud)
是的缩写
glob(qq<=>) <=> glob(qq<=>)
Run Code Online (Sandbox Code Playgroud)
哪个可以写
glob("=") <=> glob("=")
Run Code Online (Sandbox Code Playgroud)
要么
"=" <=> "="
Run Code Online (Sandbox Code Playgroud)
因为没有特殊glob字符的glob模式只返回模式.
它警告"不是数字"两次,并评估为零.
my $foo = <=>;
Run Code Online (Sandbox Code Playgroud)
是的缩写
my $foo = glob(qq<=>);
Run Code Online (Sandbox Code Playgroud)
哪个可以写
my $foo = glob("=");
Run Code Online (Sandbox Code Playgroud)
要么
my $foo = "=";
Run Code Online (Sandbox Code Playgroud)
my $foo = <a>;
Run Code Online (Sandbox Code Playgroud)
是的缩写
my $foo = readline(a);
Run Code Online (Sandbox Code Playgroud)
如果没有其他提及,它警告"只使用一次:可能的错字" *a.
如果您之前没有打开a过文件句柄,它会在"未打开的文件句柄"上发出警告.
如有疑问,请查看-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)
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.
我想我明白发生了什么事
glob("*asdf*");
Run Code Online (Sandbox Code Playgroud)
将仅返回名称中包含该字符串的文件,asdf因为元字符扩展测试文件是否存在。然而,
glob("asdf");
Run Code Online (Sandbox Code Playgroud)
无论文件的状态如何,都将始终返回。asdf通过扩展,<=>缺少元字符也将返回'='。