Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 我如何解决以下错误;未定义的子程序&;main::重置在“处调用的计数器”;?_Perl_Prototype_Subroutine_Subroutine Prototypes - Fatal编程技术网

Perl 我如何解决以下错误;未定义的子程序&;main::重置在“处调用的计数器”;?

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

如何解决以下错误“未定义的子例程&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 = ();
}
真奇怪

我最倾向于相信,在定义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,但没有它就失败了,那么仍然存在问题。换句话说,添加
&
是一种解决方法或诊断方法,而不是解决方案。