#!/usr/bin/perl -w use strict; $|++; use Data::Dumper; BEGIN { package TieFinder; sub TIEHASH { my $class = shift; my $wanted = (@_ && ref $_[0] eq 'CODE') ? shift : sub { shift }; bless { wanted => $wanted, dirs => [@_], queue => [reverse @_], # prime the pump }, $class; } sub NEXTKEY { my $self = shift; while ( @{$self->{queue}} ) { my $item = pop @{$self->{queue}}; my @lstat = lstat($item); { next if -l _; # don't recurse on symlinks local *DH; opendir DH, $item or next; push @{$self->{queue}}, reverse map "$item/$_", sort grep { $_ ne "." and $_ ne ".." } readdir DH; closedir DH; } next unless do { local $_ = $item; $self->{hash}{$item} = $self->{wanted}->(\@lstat); }; return $item; } return undef; } sub FIRSTKEY { my $self = shift; $self->{queue} = [reverse @{$self->{dirs}}]; $self->{hash} = {}; $self->NEXTKEY; } sub FETCH { my $self = shift; my $key = shift; ## warn "DEBUG: fetching $key\n"; $self->{hash}{$key}; } } tie my %f, TieFinder::, sub { -s _ or "0e0" }, @ARGV; print "key value\n"; while (my($k, $v) = each %f) { print "k = $k, v = $v\n"; } print "key\n"; while (defined(my $k = each %f)) { print "k = $k\n"; } print "dumper keys\n"; print Dumper([keys %f]); print "dumper values\n"; print Dumper([values %f]); print "dumper hash\n"; print Dumper(\%f);