我正在研究一个函数,它应该递归地解析传递给它的数据结构,然后用缩进打印出来。类似的东西:
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 @_;
}
答案 0 :(得分:1)
这个问题基于一个错误的前提:[a, b, c => 'd', e]
只会在没有use strict 'subs'
的情况下进行编译,即使这样也会发出警告
不带引号的字符串可能与未来的保留字冲突
与[ 'a', 'b', 'c', 'd', 'e' ]
fat逗号 =>
和普通逗号之间的唯一区别是,如果它是一个单词,它将隐式引用它的第一个参数
您必须始终 use strict
和use warnings 'all'
位于您编写的每个Perl程序的顶部。使用&符号&
调用子例程也是错误的。自Perl 5于二十二年前到达以来,这并不是一个好的做法。无论你使用什么教程学习Perl,你都应该删除它并找到一个更新的