Perl 我如何解决以下错误;未定义的子程序&;main::重置在“处调用的计数器”;?
如何解决以下错误“未定义的子例程&main::resetCounters在处调用”?子例程已经被原型化,但仍然有Perl的抱怨。以下代码是我遇到的问题:Perl 我如何解决以下错误;未定义的子程序&;main::重置在“处调用的计数器”;?,perl,prototype,subroutine,subroutine-prototypes,Perl,Prototype,Subroutine,Subroutine Prototypes,如何解决以下错误“未定义的子例程&main::resetCounters在处调用”?子例程已经被原型化,但仍然有Perl的抱怨。以下代码是我遇到的问题: #!/usr/bin/perl use strict; use warnings; ... sub reportStats(); sub resetCounters(); #HERE IS THE PROTOTYPE sub getUpperBusTimeStampAndBatchSize($); sub toMs($); sub tib
#!/usr/bin/perl
use strict;
use warnings;
...
sub reportStats();
sub resetCounters(); #HERE IS THE PROTOTYPE
sub getUpperBusTimeStampAndBatchSize($);
sub toMs($);
sub tibTimeToMs();
sub calcStdDev();
...
print "\nTimeStamp TPS MPS MaxBat AvgBat MaxLat AvgLat StdLat >5ms %>5ms\n";
resetCounters(); #THIS IS THE LINE CONTAINING THE ERROR
...
sub resetCounters()
# -----------------------------------------------------------
# resets all metrics counters
# -----------------------------------------------------------
{
$tps = 0;
$mps = 0;
$batch = 0;
$maxBatch = 0;
$avgBatch = 0;
$latency = 0;
$latencySum = 0;
$maxLatency = 0;
$avgLatency = 0;
$overThreshold = 0;
$percentOver = 0;
$currentSecond = $second;
@latencies = ();
}
真奇怪
我最倾向于相信,在定义resetCounters之前,某些东西正在悄无声息地失败,但“严格”应该可以防止这种情况发生
你试过用安培吗
&resetCounters();
[编辑]
我唯一见过类似的地方就是鲤鱼
脚本中的某些内容没有编译,因此BEGIN语句没有编译,您最终会从中得到错误,而不是从失败的代码中得到错误
use CGI::Carp qw(fatalsToBrowser set_message);
# HTML-format error reporter. Comment out if script wont compile
BEGIN
{ set_message( \&handle_errors ); }
我不能肯定这就是问题所在,但您可以查看pragma以预先声明函数 一个快速关闭
#!/usr/bin/env perl
use strict;
use warnings;
use subs "myclear";
my $var = 1;
myclear;
print $var;
sub myclear () {
$var = 0;
}
此外,由于这种过程命令很可能作为自己的语句出现,因此它实际上不需要空原型或任何原型
#!/usr/bin/env perl
use strict;
use warnings;
use subs "myclear";
my $var = 1;
myclear;
print $var;
sub myclear {
$var = 0;
}
除非子例程有括号,否则不需要原型。如果不包括括号,则没有问题。代码如下所示:
#!/usr/bin/perl
use strict;
use warnings;
...
print "\nTimeStamp TPS MPS MaxBat AvgBat MaxLat AvgLat StdLat >5ms %>5ms\n";
resetCounters();
...
sub resetCounters #No parentheses
# -----------------------------------------------------------
# Resets all metrics counters
# -----------------------------------------------------------
{
$tps = 0;
$mps = 0;
$batch = 0;
$maxBatch = 0;
$avgBatch = 0;
$latency = 0;
$latencySum = 0;
$maxLatency = 0;
$avgLatency = 0;
$overThreshold = 0;
$percentOver = 0;
$currentSecond = $second;
@latencies = ();
}
您是否缺少包含缺少功能的模块?请发布一个完整的复制错误的最小测试用例。您使用的是什么版本的Perl?在5.14.2下,一个最小的测试用例对我有效。您的代码在这里似乎有效。你确定resetCounters没有在某个地方未定义吗?我很想跳转到Perl调试器中,找出resetCounters何时未定义。原型是完全不必要的,而且非常复杂。您还使用括号调用sub,因此即使是转发声明也不需要。可能在第三个yada操作符中有一个
\uuuu END\uuu
标记。或者未终止的字符串、正则表达式、pod等。如果它使用了符号AND,但没有它就失败了,那么仍然存在问题。换句话说,添加&
是一种解决方法或诊断方法,而不是解决方案。