Another perl coding challenge

Todd Rockhold todd.rockhold at ontogen.com
Wed Jan 3 16:11:26 CST 2001


~sdpm~

OOPS!  I forgot to say "without using File::Find".  

But considering TIMTOWTDI and "just do it" and all the other relevant
slogans...

Thanks.

> -----Original Message-----
> From:	Eugene Tsyrklevich [SMTP:eugene at securityarchitects.com]
> Sent:	Friday, December 29, 2000 2:36 AM
> To:	san-diego-pm-list at happyfunball.pm.org
> Subject:	Re: Another perl coding challenge
> 
> ~sdpm~
> perldoc File::Find
> 
> use File::Find;
> find({/\.wel$/ && -f $_ && -T _ && -r _ && print}, $DIR);
> 
> good enough? ;-)
> 
> cheers
> 
> 
> On Thu, Dec 28, 2000 at 06:59:02PM -0800, Todd Rockhold wrote:
> > ~sdpm~
> > Probably not as fun as Garrett's "reversible NAND gate" problem, but
> here is
> > one I have encountered. I have a test system (Perl 5.6) and a production
> > system (Perl 5.005).  I would like to run the tree walker on the
> production
> > system.
> > 
> > The following code walks  a directory tree if run with Perl 5.6 but
> fails
> > with earlier versions.  How do I modify it so that it will work with
> Perl
> > 5.005?
> > 
> >
> --------------------------------------------------------------------------
> --
> > --------------------------------------------------------------
> > 
> > my $DIR = "//yogi/yogidata/OntoCHROMRun/TestRuns";  # contains well
> files
> > my $it = make_treewalker($DIR, \&is_well_file, sub {@{$_[1]}});
> > while (defined (my $f_it=$it->()))  
> > {
> >    # process the interesting file
> >    print "found file: $f_it\n";
> > }
> > 
> > sub make_treewalker    #black magic to walk the directory tree
> >    {
> >      my @queue = shift();
> >      my ($is_interesting, $userparam) = @_;
> >      return sub
> >        {
> >  	while(1)
> >  	  {
> >  	    return undef unless @queue;
> >  	    my $cur = shift @queue;
> >  	    if (-d $cur && opendir my $dh, $cur)
> >  	      {
> >  		my @files = grep {$_ ne '.' && $_ ne '..'} (readdir $dh);
> > 		push @queue, map {"$cur/$_"} @files;
> >  	      }
> >  	    return $cur if $is_interesting->($cur, $userparam);
> >  	  }
> >        }
> >    }
> > 
> > 
> > sub is_well_file # what files do we care about?
> >   {
> >     return () unless -f $_[0] && -T $_[0];  # gotta be a simple file
> >     return () unless open FH, "< $_[0]";    # gotta be able to open it
> >     return ($_[0]) if $_[0] =~ /\.wel/i ;   # gotta be a .WEL file
> >     return ();                              
> >   }
> ~sdpm~
> 
> The posting address is: san-diego-pm-list at hfb.pm.org
> 
> List requests should be sent to: majordomo at hfb.pm.org
> 
> If you ever want to remove yourself from this mailing list,
> you can send mail to <majordomo at happyfunball.pm.org> with the following
> command in the body of your email message:
> 
>     unsubscribe san-diego-pm-list
> 
> If you ever need to get in contact with the owner of the list,
> (if you have trouble unsubscribing, or have questions about the
> list itself) send email to <owner-san-diego-pm-list at happyfunball.pm.org> .
> This is the general rule for most mailing lists when you need
> to contact a human.
~sdpm~

The posting address is: san-diego-pm-list at hfb.pm.org

List requests should be sent to: majordomo at hfb.pm.org

If you ever want to remove yourself from this mailing list,
you can send mail to <majordomo at happyfunball.pm.org> with the following
command in the body of your email message:

    unsubscribe san-diego-pm-list

If you ever need to get in contact with the owner of the list,
(if you have trouble unsubscribing, or have questions about the
list itself) send email to <owner-san-diego-pm-list at happyfunball.pm.org> .
This is the general rule for most mailing lists when you need
to contact a human.




More information about the San-Diego-pm mailing list