X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=samples%2Fhash2array.pl;h=d703ada917d6faf904b2d1d26472d82f5bb4bfac;hb=acd04c4caf2a342c115cd053dd5552a9ae2c414a;hp=72cd2657ee2c1c689e85442bbca1f77b20d68330;hpb=92240461f2d526a94139ed4cf0fff445465b380d;p=perl%2Fmodules%2Fautovivification.git diff --git a/samples/hash2array.pl b/samples/hash2array.pl index 72cd265..d703ada 100644 --- a/samples/hash2array.pl +++ b/samples/hash2array.pl @@ -3,13 +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/21-array.t'; +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) = @_; @@ -23,33 +27,85 @@ 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/.*?(?) { if (/^__DATA__$/) { $in_data = 1; - print $array_t $_; + print $array_t $_; + print $array_fast_t $_; } elsif (!$in_data) { - s{s/\^\$/%/}{s/^\$/@/}; - print $array_t $_; + s{'%'}{'\@'}; + print $array_t $_; + print $array_fast_t $_; } else { - s!->{([a-z])}!'->[' . num($1) . ']'!eg; - my $buf; - my $suffix = $_; - my ($bracket, $prefix); - while (do { ($bracket, $suffix, $prefix) = extract($suffix); $bracket }) { - $buf .= $prefix . dump_array(hash2array(eval $bracket)); + 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); } - $buf .= $suffix; - $buf =~ s/\s+/ /g; - $buf =~ s/\s+$//; - print $array_t "$buf\n"; + } else { + $_ = convert_testcase($_, 1); } + print $array_kv_t $_; }