#!perl use strict; use warnings; use feature qw (say); $|=1; use Diagnostics; use Data::Dumper; use Data::Dump::Streamer; my $cpan = {a=>0}; #_=>'',__=>'' &grow_tree; sub grow_tree { while (){ chomp; my @fields = split /\s+/;#say "@fields"; my @names = split /::/, $fields[0];#say "names($#names): @names"; my $cur; my @ancestors = @names; pop @ancestors; #print "for ",(join '::',@names)," ancestor is ",( $ancestors[$#ancestors]||'CPAN' ),"\n"; print "for ",(join '::',@names)," ancestor is ",( $ancestors[$#ancestors]?(join '::',@ancestors) : 'CPAN' ),"\n"; print "\t\t-->\$cpan",(defined $ancestors[0] ?'{'.(join '}{', @ancestors ).'}':''),"\n"; my $pater; say ' $pater = \$cpan'.(defined $ancestors[0] ?'{'.(join '}{', @ancestors ).'}':''); eval ' $pater = \$cpan'.(defined $ancestors[0] ?'{'.(join '}{', @ancestors ).'}':''); say '$cpan->{'.(join '}{', @names).'} = {_=>$names[-1],__=> \$pater}; '; eval '$cpan->{'.(join '}{', @names).'} = {_=>$names[-1],__=> \$pater}; '; print "\n"; } Dump($cpan); } exit; __DATA__ ABI 1.0 M/MA/MALAY/ABI-1.0.tar.gz Abilities 0.5 I/ID/IDOPEREL/Abilities-0.5.tar.gz Abilities::Features 0.5 I/ID/IDOPEREL/Abilities-0.5.tar.gz Abilities::Scoped 0.2 I/ID/IDOPEREL/Abilities-0.2.tar.gz Abilities::Scoped::FAKE 0.2 I/ID/fake/Abilities-0.2.tar.gz ABNF::Generator undef N/NY/NYAAPA/ABNF-Grammar-0.08.tar.gz ABNF::Generator::Honest undef N/NY/NYAAPA/ABNF-Grammar-0.08.tar.gz ABNF::Generator::Liar undef N/NY/NYAAPA/ABNF-Grammar-0.08.tar.gz ABNF::Grammar 0.08 N/NY/NYAAPA/ABNF-Grammar-0.08.tar.gz ABNF::Validator undef N/NY/NYAAPA/ABNF-Grammar-0.08.tar.gz about undef S/SH/SHERWOOD/xisofs-1.3.tar.gz above 0.03 B/BR/BRUMMETT/UR-0.43.tar.gz