为什么你可以在声明sub foo之前调用foo()和& foo,但是你不能调用plain foo?

时间:2016-09-16 12:03:42

标签: perl

请解释为什么在函数定义之上调用这些Perl函数的方式决定了它们是否运行。

\$PATH

2 个答案:

答案 0 :(得分:7)

如果解析器知道有问题的标识符引用了函数,则只能在函数调用中省略括号。

您的第一个foo;不是函数调用,因为解析器还没有看到sub foo(并且foo不是内置函数。)

如果您在顶部使用use strict; use warnings;,则会将其标记为错误。

答案 1 :(得分:3)

引用perldata

  

在语法中没有其他解释的单词将被视为带引号的字符串。这些被称为“赤字”。

这意味着foo相当于"foo",而没有一个子声明给它一个替代解释。

$ perl -e'my $x = foo; print("$x\n");'
foo

这被视为错误功能,因此被use strict;(或更具体地,use strict qw( subs );)禁用以捕获拼写错误。

$ perl -e'use strict; my $x = foo; print("$x\n");'
Bareword "foo" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.

始终使用use strict; use warnings qw( all );