Как мне решить следующую ошибку "Неопределенная подпрограмма & main :: resetCounters вызвана в"? - PullRequest
4 голосов
/ 06 января 2012

Как мне решить следующую ошибку "Неопределенные подпрограммы и 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 ]

1 голос
/ 06 января 2012

Не могу с уверенностью сказать, что это проблема, но вы можете взглянуть на прагму 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 голос
/ 06 января 2012

Прототип не требуется, кроме случаев, когда подпрограмма содержит круглые скобки. Если вы не включите скобки, то это не проблема. Код будет выглядеть так:

#!/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 = ();
}
0 голосов
/ 06 января 2012

Это странно.

Я бы предпочел поверить, что что-то не работает молча, прежде чем определяется resetCounters, но тогда «строгое» должно это предотвратить.используя амперсанд?

&resetCounters();

[EDIT]

Единственное место, где я видел нечто подобное, это CARP.

Что-то в скрипте не компилируется, поэтому оператор BEGIN не компилируется, и в итоге вы получаете ошибку, а не код, который не сработал.

...