2012-01-05 41 views
4

我該如何解決以下錯誤「未定義的子程序& main :: resetCounters called at」?該子程序已經建立了原型,但Perl仍然抱怨。下面的代碼是我遇到的問題:我將如何解決以下錯誤「未定義的子程序和main :: resetCounters調用」?

#!/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

swag ---您是否缺少包含缺少功能的模塊?請發佈完整的重現錯誤的最小測試用例。 – 2012-01-05 20:03:08

+1

您使用的是什麼版本的Perl?一個最小的測試用例適用於5.14.2。 – CanSpice 2012-01-05 20:09:17

+0

你的代碼似乎在這裏工作。你確定resetCounters沒有被定義在某個地方嗎?我很想進入Perl調試器,找出resetCounters何時未定義。 – Rohaq 2012-01-05 20:18:22

回答

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 =(); 
} 
+0

謝謝,已經有了 – 2012-01-06 21:09:24

-1

這是奇怪的。

在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); } 
+0

如果它與&符合使用,但如果沒有它,失敗仍然存在問題。換句話說,添加'&'是解決方法或診斷,而不是解決方案。 – 2012-01-05 20:37:52

1

我不能肯定地說,這是問題,但你可能會考慮在subs編譯爲predeclaring的功能。

一個快速關閉...

#!/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; 
} 
+0

下載者會關注評論嗎? – 2012-01-06 21:06:59

相關問題