【问题标题】:Perl error comes in recursive function process [duplicate]Perl错误出现在递归函数过程中[重复]
【发布时间】:2023-04-04 18:01:01
【问题描述】:

递归函数运行时出现Perl错误如何解决

main::getE_Path_Rec() called too early to check prototype at ./test.pl line 28

由 cat -n 显示:

13  our ($whole, @result);
14
15  sub getE_Path_Rec ($\@$) { my ($path, @iOffNode, $offset) = @_;
16  
17      $path=~ s#^/([^/]+)(.*)$#$2#;
18      my @OffNode;    my $eleNow=$1;
19      for (@iOffNode) {
20          $eleNow=~ m#^([^[/,]+)(?|\[(\d+|@[^]]+)\]|,(\d+))?#;
21      #
22              if($2) {
23                  getElem($1, $2-1, $_->[1], @OffNode);
24                  return undef if !@OffNode;
25                  if ($path) {
26      #
27      #
28                      getE_Path_Rec( $path, @OffNode, $offset.${$OffNode[0]}[0])
29                  }else {
30                      push( @result, [$offset, ${$OffNode[0]}[1]])
31                  }

36          }
37  
38          return
39  }

我们如何在 Perl 中无缝解决递归函数?

【问题讨论】:

  • (1) 一个建议:总是很好地清理你发布的内容——删除那些行号(这样人们可以复制粘贴它进行测试),删除空行上的 cmets (?),排队大括号、缩进等 (2) 你确定那些 ($whole, @result) 需要是 our 吗?这是一个常见的错误——大多数时候他们应该是my
  • @iOffNode 是错误的。你想要$iOffNode。 // our 应该是 my // 而且我没有看到在这里使用原型的意义。它只会增加复杂性。

标签: perl


【解决方案1】:

prototype in perlsub 的文档说明了这一点

...必须预先声明带有原型的递归函数才能使原型生效

所以需要

sub getE_Path_Rec ($\@$);          # predeclare

# later
sub getE_Path_Rec ($\@$) { ... }   # actual definition

【讨论】:

  • 也许还提到原型不是必需的,最好省略。
  • @TLP 我不知道他们为什么在那里有原型。原型是有目的的,而且很有用,所以当我对他们的设计一无所知时,我不想讲 OP。 (即使该代码中的原型确实似乎不需要。)
  • ,,, 但更重要的是,当我打算扩展答案并清理问题时,他们将其关闭为重复项。 (顺便说一句,对于一个根本没有“提及”任何东西而只是转储一个短语“前向声明”的非答案,这对初学者来说只能是神秘的。我不想重新打开,因为这在技术上是一个答案.) 所以我现在看不出花时间在这上面的目的。
  • 嗯,你已经回答了这个问题。原型是有史以来最糟糕的事情,欺骗粗心的人,可能是其中的一部分。只是说
  • @TLP "you've answer the question" -- 是的,后来因为更糟糕的事情而关闭(无论如何我认为);所以我不想再碰它了,因为它不会受到太多关注,被关闭了。至于原型......我已经警告过他们很多,围绕着各种 cmets 和答案。但这是一个可以有效使用的功能,我不应该禁止它们,特别是当我不知道它们的用途时。 (我用了几次,效果很好。)
猜你喜欢
  • 2021-05-10
  • 2011-01-24
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多