7 use Text::Balanced qw/extract_bracketed/;
9 open my $hash_t, '<', 't/20-hash.t';
10 open my $array_t, '>', 't/30-array.t';
11 open my $array_fast_t, '>', 't/31-array-fast.t';
14 my ($char) = $_[0] =~ /['"]?([a-z])['"]?/;
15 return ord($char) - ord('a')
20 return $h unless $h and ref $h eq 'HASH';
23 $array[num($_)] = hash2array($h->{$_});
30 return 'undef' unless defined $a;
31 return $a unless ref $a;
32 die "Invalid argument" unless ref $a eq 'ARRAY';
33 return '[ ' . join(', ', map dump_array($_), @$a) . ' ]';
36 sub extract ($) { extract_bracketed $_[0], '{', qr/.*?(?<!\\)(?:\\\\)*(?={)/ }
43 print $array_fast_t $_;
47 print $array_fast_t $_;
49 for my $file ([ 1, $array_t ], [ 0, $array_fast_t ]) {
51 s!(\ba\b)?(\s*)HASH\b!($1 ? 'an': '') . "$2ARRAY"!eg;
53 {\s*(['"]?[a-z]['"]?(?:\s*,\s*['"]?[a-z]['"]?)*)\s*}
55 '[' . join(', ', map { my $n = num($_); $file->[0] ? "\$N[$n]" : $n }
56 split /\s*,\s*/, $1) . ']'
61 my ($bracket, $prefix);
62 while (do { ($bracket, $suffix, $prefix) = extract($suffix); $bracket }) {
63 $buf .= $prefix . dump_array(hash2array(eval $bracket));
68 print { $file->[1] } "$buf\n";