perl 如何确定代码的某个部分是否是声明(何时生效)?知道这一点有多大实际用处?

carvr3hs  于 2023-11-22  发布在  Perl
关注(0)|答案(1)|浏览(206)

我正在熟悉perl。我使用一行程序已经有一段时间了,现在我想了解更长的程序。
我正在阅读手册页,完成了perl,perlintro,perlsyn。在发现有man strict之后,我对perl文档印象深刻。
perlsyn“声明”中:
声明可以放在语句可以放在的任何地方,但对语句的主序列的执行没有影响:声明都在编译时生效。
但是我不知道如何区分声明。正如我所理解的那样,对函数的调用可以是一个语句,也可以是一个声明,例如use VERSION在手册页中多次提到为declaration。知道哪一行是声明,哪一行不是声明有多大用处?
添加(并编辑标题,替换“行”):
我意识到在编译过程中是否处理某些东西可能很重要。@ikegami的回答将use称为directive,但更重要的是它是如何处理的:
因为“use”在编译时生效,所以它不尊重正在编译的代码的普通流控制。特别是,将“use”放在条件的false分支中并不会阻止它被处理。
有什么一般的方法可以知道代码的某一部分在编译过程中是否有效?

eagi6jfj

eagi6jfj1#

声明给予编译器关于你声明的东西的信息。

  • 你可以申报一个子。
sub foo;        # Declares a sub that has neither a prototype nor a signature.
sub bar($);     # Declares a sub with a prototype
sub baz( $x );  # Declares a sub with a signature
sub qux { }     # Defining a sub also declares it.

字符串
在Perl中,你通常不需要声明一个sub,除非是在定义它的时候。下面是一些需要声明的例子:

  • 允许对尚未定义的sub进行无括号的sub调用。
sub f;

f;

sub f {
   ...
}

  • 对于具有原型或签名的递归sub。
sub g($);

sub g($) {
   ...
   ... g($x) ...
   ...
}

  • 你可以声明一个变量。

与subs不同,声明一个变量也会创建它。

my $x;     # Lexically-scoped variable.
state $x;  # Lexically-scoped persitent variable.
our $x;    # Lexically-scoped alias to a package variable.


知道哪一行是声明,哪一行不是声明有多大用处?
了解声明的作用可以让您在需要时使用它。
use VERSION;的文档确实称之为声明,但这是一个不同的词。“指令”在这里会更好。指令是指示编译器如何行为的松散术语。use VERSION;不声明任何东西,但指示编译器执行版本检查,它告诉它使用什么“语言版本”。
这不是一个格式概念。什么才算是指令是主观的,所以
知道哪一行是声明指令,哪一行不是有多大用处?
不是的
(Also,“line”?除了极少数例外,Perl不关心行。

相关问题