[Chicago-talk] Is it worth to be put in CPAN?
tiger peng
tigerpeng2001 at yahoo.com
Mon Oct 16 17:45:18 PDT 2006
Hi all,
Recently, I am handling a couple of hierarchy data, such as purging log files, purging data base table without foreign key being implemented in DBMS, generating catalog XML files, etc.
After searching CPAN without finding very simple/generic modules. So, I made one module for myself. It seems very convenient to me. I am wandering if it is worth to be put on CPAN?
The module have only one recursive function, hierarchy_traverse, with the interface as below:
#######
hierarchy_traverse($roots, # a scalar for one root,
# or a ref to a list of roots,
# or a ref to a list of list that contain information about the roots.
\&get_children, # a function for get child nodes
{ #Options
depth => 1, # how depth limitaion. (default undef, no limitation)
pre_branch => sub {print "dir: ", $_[0],"\n"}, # the function called before visit childeren nodes
post_branch => sub {}, # the fucntion called after visite all it children nodes
bare_branch => sub {print "empty dir: ", $_[0],"\n"}, # the function for empty branches
leaf => sub {...} # the function for leaf nodes
is_leaf => sub { ! -d $_[0]} , # the function for check if a node is leaf
# all default functions are default to be {} (do nothing and return false)
} ,
}
);
########
And Here is a test script for that get total size of ".XML" file under some directions.
hierTest.pl
#!/usr/local/bin/perl -w
use strict;
use lib "/home/tiger/playground/tigercvs/powerReviews/lib";
use Hierarchy::Traverser;
my $total_file_size;
my $roots=["/home/tiger/playground/tigercvs/powerReviews/bin"];#, "/home/tiger/playground/p2000"];
hierarchy_traverse($roots, \&read_dir,
{
deepth=>1,
#pre_branch => sub {print "dir: ", $_[0],"\n"},
post_branch => sub {},
#bare_branch => sub {print "empty dir: ", $_[0],"\n"},
is_leaf => sub { ! -d $_[0]} ,
leaf => sub {if ($_[0] =~ /\.xml/i) {
print "file: $_[0]";
my $file_size = -s $_[0];
print "\t$file_size\n";
$total_file_size += $file_size}
} ,
}
);
print "total file size $total_file_size \n";
sub read_dir{
if (! -d $_[0]) {
warn "Try to open dir where $_[0] is not dir\n";
return;
}
my $dirhandle;
my $files =[];
opendir ($dirhandle, $_[0]) or die "Cannot open $_[0] dir";
while ( defined (my $file = readdir($dirhandle)) ) {
next if $file =~ /^\.\.?$/;
if (-l $file) {warn "Ignore $_[0]/$file, which is a link.\n"; next}
push @$files, "$_[0]/$file";
}
closedir $dirhandle;
return $files;
}
Out put:
Ignore /home/tiger/playground/tigercvs/powerReviews/bin/cvslink, which is a link.
Ignore /home/tiger/playground/tigercvs/powerReviews/bin/tree1.data.link, which is a link.
file: /home/tiger/playground/tigercvs/powerReviews/bin/catalog_print.xml 100739
file: /home/tiger/playground/tigercvs/powerReviews/bin/catalog_xmlsimple.xml 83738
file: /home/tiger/playground/tigercvs/powerReviews/bin/catalog_print_pretty.xml 93965
file: /home/tiger/playground/tigercvs/powerReviews/bin/empty.xml 100739
file: /home/tiger/playground/tigercvs/powerReviews/bin/catalog_xmlsimple_with_empty.xml 88969
file: /home/tiger/playground/tigercvs/powerReviews/bin/allCata.xml 166937
file: /home/tiger/playground/tigercvs/powerReviews/bin/tmp.xml 79003
total file size 714090
More information about the Chicago-talk
mailing list