X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=samples%2Fhash2array.pl;h=d703ada917d6faf904b2d1d26472d82f5bb4bfac;hb=eb76b95ba4e9ea8db6ff7e499f1df8912e7c9da9;hp=8b3419d1139fbdbb68f742470b85125bbc8aec40;hpb=b40a565a6a78eb14572fc60de1807d91662017fd;p=perl%2Fmodules%2Fautovivification.git diff --git a/samples/hash2array.pl b/samples/hash2array.pl index 8b3419d..d703ada 100644 --- a/samples/hash2array.pl +++ b/samples/hash2array.pl @@ -3,14 +3,17 @@ use strict; use warnings; -use Fatal qw/open/; -use Text::Balanced qw/extract_bracketed/; +use Fatal qw; +use Text::Balanced qw; open my $hash_t, '<', 't/20-hash.t'; open my $array_t, '>', 't/30-array.t'; open my $array_fast_t, '>', 't/31-array-fast.t'; -sub num { ord($_[0]) - ord('a') } +sub num { + my ($char) = $_[0] =~ /['"]?([a-z])['"]?/; + return ord($char) - ord('a') +} sub hash2array { my ($h) = @_; @@ -24,13 +27,48 @@ sub hash2array { sub dump_array { my ($a) = @_; + return 'undef' unless defined $a; - return $a unless ref $a; - die "Invalid argument" unless ref $a eq 'ARRAY'; - return '[ ' . join(', ', map dump_array($_), @$a) . ' ]'; + + if (ref $a) { + die "Invalid argument" unless ref $a eq 'ARRAY'; + return '[ ' . join(', ', map dump_array($_), @$a) . ' ]'; + } else { + $a = "'\Q$a\E'" if $a !~ /^\s*\d/; + return $a; + } } -sub extract ($) { extract_bracketed $_[0], '{', qr/.*?(?) { @@ -43,21 +81,31 @@ while (<$hash_t>) { print $array_t $_; print $array_fast_t $_; } else { - for my $file ([ 1, $array_t ], [ 0, $array_fast_t ]) { - local $_ = $_; - s!(\ba\b)?(\s*)HASH\b!($1 ? 'an': '') . "$2ARRAY"!eg; - s!->{([a-z])}!my $n = num($1); '->[' . ($file->[0] ? "\$N[$n]" : $n) .']'!eg; - s!%(\{?)\$!\@$1\$!g; - my $buf; - my $suffix = $_; - my ($bracket, $prefix); - while (do { ($bracket, $suffix, $prefix) = extract($suffix); $bracket }) { - $buf .= $prefix . dump_array(hash2array(eval $bracket)); - } - $buf .= $suffix; - $buf =~ s/\s+/ /g; - $buf =~ s/\s+$//; - print { $file->[1] } "$buf\n"; + print $array_t convert_testcase($_, 0); + print $array_fast_t convert_testcase($_, 1); + } +} + +close $hash_t; +close $array_t; +close $array_fast_t; + +open my $hash_kv_t, '<', 't/22-hash-kv.t'; +open my $array_kv_t, '>', 't/32-array-kv.t'; + +$in_data = 0; +while (<$hash_kv_t>) { + if (/^__DATA__$/) { + $in_data = 1; + } elsif (!$in_data) { + s{'%'}{'\@'}; + if (/\bplan\s*[\s\(]\s*tests\b/) { + s/\s*;?\s*$//; + s/^(\s*)//; + $_ = qq($1if ("\$]" >= 5.011) { $_ } else { plan skip_all => 'perl 5.11 required for keys/values \@array' }\n); } + } else { + $_ = convert_testcase($_, 1); } + print $array_kv_t $_; }