如何解决以下错误“Undefined subroutine& main :: resetCounters”?该子程序已经原型化,但Perl仍然抱怨。以下代码是我遇到的问题:
#!/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 = ();
}
答案 0 :(得分:1)
我不能确定这是问题所在,但您可以查看subs
编译指示以预先确定您的函数。
快速关闭......
#!/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;
}
答案 1 :(得分:1)
除非子程序有括号,否则不需要原型。如果您不包括括号,则没有问题。代码看起来像:
#!/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 = ();
}
答案 2 :(得分:-1)
这很奇怪。
我最倾向于认为在定义resetCounters之前某些东西是无声的失败,但是,“严格”应该阻止它。
您是否尝试过使用&符号?
&resetCounters();
[编辑]
我见过的唯一一个与CARP相似的地方。
脚本中的某些内容无法编译,因此BEGIN语句不会编译,您最终会从中获取错误,而不是从失败的代码中获取错误。
use CGI::Carp qw(fatalsToBrowser set_message);
# HTML-format error reporter. Comment out if script wont compile
BEGIN
{ set_message( \&handle_errors ); }