我如何解决以下错误“Undefined subroutine& main :: resetCounters”?

时间:2012-01-05 20:00:47

标签: perl prototype subroutine subroutine-prototypes

如何解决以下错误“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 = ();
}

3 个答案:

答案 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 ); }