如何处理Perl(模糊)错误

时间:2011-12-23 03:25:14

标签: perl debugging

我在Perl代码中遇到了错误,这些错误是在与错误无关的地方报告的。我删除了数小时后修复了一个这样的错误,并逐行重新添加代码然后做了一些试验和错误。下面详述了两个这样的错误。我的问题是:如果将来发生这些问题,有没有办法确保perl编译器帮助我解决这个问题,或者我是否必须用其他语言重写代码。 (我正在考虑Java)。

我的程序如下:

use switch;
use strict;
use warnings;
...other modules;
sub log{
}
..various sub routines
switch {$val1)
{
  log(..) #first invocation of log
  case ($val2)
...
}

如果我这样做,现在在子日志中

{
  $val3  = POSIX::floor($val2/$val4)*$val4;
  $val5="/x/y/$logfilename";
}

我收到错误,说明在case语句中有错误。 如果我移动行$ val5 =“/ x / y / $ logfilename”;在$ val3之前,没有错误。 或者如果我删除$ val5中的'/',即$ val5 =“x”,则没有错误 或者,如果我说$ val5 = qq(/ x / y / $ logfilename);没有错误。 这次我认为自己很幸运,因为我找到了一个解决方法,但这只是在经过3个小时的斗争之后。有没有办法让perl编译器准确报告错误?

我还有一个类似的案例要报告,如有必要可以添加。 请求输入

2 个答案:

答案 0 :(得分:9)

忽略帖子的问题,您可能遇到的问题是perl中的switch功能是使用源过滤器实现的。这基本上意味着对源代码进行预处理,以便在编译之前将看起来像开关案例结构的内容转换为有效的perl代码。 Perl的解析器通常在复杂结构上得到一些错误的行号,但是当涉及源过滤器时,所有的投注都是关闭的。这是在现代版本的Perl中不推荐使用Switch的原因之一。

解决方案是停止使用switch,并使用Perl的其他控制结构,或使用足够新的perl版本来支持given/when构造(5.10+),这是现代Perl版本的switch / case

答案 1 :(得分:3)

LIMITATIONS in Switch听起来很有意义:

  

由于Switch.pm的源解析的启发式特性,使用原始/.../分隔符指定并且没有修饰符// x的嵌入换行符的正则表达式的存在与从开头的代码块无法区分分部操作员/。作为一种解决方法,你必须使用m /.../或m?...?对于这种模式。还有,用raw指定的正则表达式的存在?...?分隔符可能会导致神秘的错误。解决方法是使用m?...?代替。

开关模块是深黑魔法。除非你准备调试它的问题,否则请不要使用它。