新的idioma和如何检测递归级别

时间:2013-05-23 12:18:17

标签: perl recursion

这不是一个问题。 我想我发明了新的惯用语 - 优雅的说法: 做一些事情,如果失败,试着修复它再做一次。 如果失败三次,就放弃。它看起来不错吗?

use strict;

write_file('lol');
write_file('abc');
write_file('def');
write_file('ijk');

my $depth;
sub write_file
{
  if ( $depth++ > 3 ) { die 'FAIL' };
  print FILE $depth.join ', ', @_  or open(FILE, '>log'), write_file(@_);
  $depth = 0;
}

2 个答案:

答案 0 :(得分:1)

任何循环都可以通过递归来实现。这并不意味着你应该!

sub write_file
{
  my $tries = 3;  # Retries until it fails this many times.
  my $FILE;
  while (1) {
     open($FILE, '>>', 'log')
        and last;
     die $! if !--$tries;
  }

  print $FILE join(', ', @_);
}

但为什么你认为尝试不止一次会有所帮助?无法创建文件主要是由权限错误引起的,或者因为您尝试创建该文件的目录不存在。在这种情况下,多次尝试不会有所帮助。


无论如何要回答你的问题(因为它与其他场景相关),请将深度作为参数传递。

sub visit {
   my ($tree, $depth) = @_;
   $depth //= 0;

   ...
   visit($node, $depth+1);
   ...
}

visit($tree);

答案 1 :(得分:0)

如何只是打开文件以追加(>>)而不是使用覆盖(>)?并且你不应该在子程序中使用“全局”变量和全局文件句柄,这只是要求麻烦。

write_file('lol');
write_file('abc');
write_file('def');
write_file('ijk');

sub write_file {
    my $file = "log";
    open my $fh, ">>", $file or die "Cannot open '$file': $!";
    print $fh @_;
    close $fh;
}

使用词法文件句柄和三参数打开,确保您的文件句柄仅在您需要时打开,并且模式是您想要的。在调试时,检查open的{​​{1}}和错误报告die的返回值是非常宝贵的。

不,这个成语是“如果一开始你失败了,试着再试一次。” :)有人可能会在那里投入“并阅读文档”,其中涉及到perl。