我正在尝试理解我继承的Perl代码:
sub myfunc($)
{
my ($path) = @_;
unless ($^C)
{
# manipulate path
}
return $path;
}
但是我不理解$^C
测试。它是做什么的?
Perl的-c
开关编译源代码并告诉您语法是否有效。但是,Perl在编译时和运行时之间没有严格的区分。您可以在编译过程中运行一些代码(BEGIN
块),也可以在运行(eval()
块)时编译代码。
这意味着您可能认为在语法检查时是安全的,但实际上是错误的。第二个例子实际运行了一些代码:
$ perl -c -le 'print "Hello!"'
-e syntax OK
$ perl -c -le 'BEGIN{print "Hello!"}'
Hello!
-e syntax OK
这在ide中更重要。其中许多将持续在源代码上运行perl -c
,以便它可以突出问题。然而,这也意味着您的IDE现在可能是一个特洛伊木马,用于执行您刚刚从Stackoverflow复制和粘贴的代码。
因此,$^C
守卫(参见perlvar):
$ perl -c -le 'BEGIN{ print "Hello!" unless $^C }'
-e syntax OK
我猜把它放在那里的开发人员要么打赌要在一个程序中使用所有特殊变量,要么是对他们的工具的不希望的行为做出反应。