在Perl中缩进并递归打印数据结构

时间:2016-03-24 22:39:09

标签: perl recursion

我正在研究一个函数,它应该递归地解析传递给它的数据结构,然后用缩进打印出来。类似的东西:

indent(foo=>{bar=>'baz'})
should print like:
foo
  bar : baz

indent(foo=>[a,b,c=>'d',e])
should print like
foo
  a
  b
  c:d
  e

我在Stack Overflow上遇到了一个post,其中使用了深度优先递归的非常类似的场景,以及关于如何通过Perl数据结构递归的this page

但是,我无法理解内部子工作原理。此外,它不会缩进/打印某些情况,如:

[aa,xx=>'yy',rr]
Output:
  aa
  xx
  yy
  rr

这是我正在尝试使用的代码:

&expand_references2([aa,xx=>'yy',rr]);

sub expand_references2 {
  my $indenting = -1;
  my $inner; $inner = sub {
    my $ref = $_[0];
    my $key = $_[1];
    $indenting++;
    if(ref $ref eq 'ARRAY'){
      print '  ' x $indenting;
      printf("%s\n",($key) ? $key : '');
      $inner->($_) for @{$ref};
    }elsif(ref $ref eq 'HASH'){
      print '  ' x $indenting;
      printf("%s\n",($key) ? $key : '');
      for my $k(sort keys %{$ref}){
        $inner->($ref->{$k},$k);
      }
    }else{
      if($key){
        print '  ' x $indenting,$key,' => ',$ref,"\n";
      }else{
        print '  ' x $indenting,$ref,"\n";
      }
    }
    $indenting--;
  };
  $inner->($_) for @_;
}

1 个答案:

答案 0 :(得分:1)

这个问题基于一个错误的前提:[a, b, c => 'd', e]只会在没有use strict 'subs'的情况下进行编译,即使这样也会发出警告

  

不带引号的字符串可能与未来的保留字冲突

[ 'a', 'b', 'c', 'd', 'e' ]

相同

fat逗号 =>和普通逗号之间的唯一区别是,如果它是一个单词,它将隐式引用它的第一个参数

必须始终 use strictuse warnings 'all'位于您编写的每个Perl程序的顶部。使用&符号&调用子例程也是错误的。自Perl 5于二十二年前到达以来,这并不是一个好的做法。无论你使用什么教程学习Perl,你都应该删除它并找到一个更新的