作为我之前的帖子的后续行动!
我用嵌套的哈希引用测试了算法:
算法:
use strict;
use warnings;
&expand_references2([a,b,{c=>123},d]);
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:
expand_references2(hash=>{
d1=>{a=>123,
b=>234},
d2=>[1,2,3],
d3=>'hello'});
输出:
Hash
<newline> # not required
d1
a => 123
b => 234
d2
1
2
3
d3 => hello
相反,我更喜欢这样的输出:
Hash
d1
a => 123
b => 234
d2
1
2
3
d3 => hello
或者
Hash
d1
a => 123
b => 234
d2
1
2
3
d3 => hello
示例 2:
expand_references2([a,b,{c=>123},d]);
输出:
a
b
c=>123 # indentation not required
d
关于如何在没有额外换行符的情况下实现上述场景或正确缩进的任何指导?
感谢任何帮助。
谢谢