我只是在读取秘密的伪常量,即太空舰队常量
<=><=><=> 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
中的内容不是字母数字,我认为它会退回到原义上,即是否支持该行为?
答案 0 :(得分:9)
在需要表达式的地方,Perl选择以下适用的第一个:
<>
是<ARGV>
的缩写<<>>
是<>
的“安全”版本(使用3-arg打开而不是2-arg打开)<<
是here-doc operator的开头。<IDENTIFIER>
代表readline(IDENTIFIER)
<...>
否则为glob(qq<...>)
在期望使用infix或postfix运算符的地方,Perl选择以下适用的第一个:
<=>
是numerical comparison operator。<=
是小于或等于数字的数字运算符。<<
是移位运算符。<
是数值小于运算符。(最后三个可能在这里不相关。我添加了它们以涵盖从<
开始的所有内容。)
所以
<=><=><=>
是
的缩写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
,无论文件的状态如何。通过扩展<=>
缺少元字符也将返回'='
。