| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package Dir::Iterate; | 
| 2 |  |  |  |  |  |  |  | 
| 3 |  |  |  |  |  |  | =head1 NAME | 
| 4 |  |  |  |  |  |  |  | 
| 5 |  |  |  |  |  |  | Dir::Iterate - map/grep-style directory traversal | 
| 6 |  |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | use Dir::Iterate; | 
| 10 |  |  |  |  |  |  |  | 
| 11 |  |  |  |  |  |  | my @config_dirs = grepdir { -d } '/etc'; | 
| 12 |  |  |  |  |  |  | my @filenames = mapdir { (split '/')[-1] } $ENV{HOME}, '/usr'; | 
| 13 |  |  |  |  |  |  |  | 
| 14 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 15 |  |  |  |  |  |  |  | 
| 16 |  |  |  |  |  |  | Dir::Iterate implements equivalents to the built-in C | 
| 17 |  |  |  |  |  |  | which traverse directories instead of arrays.  The block will be called for | 
| 18 |  |  |  |  |  |  | each file and directory below the given list of directories.  It acts as a | 
| 19 |  |  |  |  |  |  | more usable layer on top of File::Find. | 
| 20 |  |  |  |  |  |  |  | 
| 21 |  |  |  |  |  |  | =head2 Functions | 
| 22 |  |  |  |  |  |  |  | 
| 23 |  |  |  |  |  |  | =over 4 | 
| 24 |  |  |  |  |  |  |  | 
| 25 |  |  |  |  |  |  | =cut | 
| 26 |  |  |  |  |  |  |  | 
| 27 | 3 |  |  | 3 |  | 62076 | use strict; | 
|  | 3 |  |  |  |  | 7 |  | 
|  | 3 |  |  |  |  | 75 |  | 
| 28 | 3 |  |  | 3 |  | 16 | use warnings; | 
|  | 3 |  |  |  |  | 4 |  | 
|  | 3 |  |  |  |  | 84 |  | 
| 29 |  |  |  |  |  |  |  | 
| 30 | 3 |  |  | 3 |  | 15 | use Exporter; | 
|  | 3 |  |  |  |  | 9 |  | 
|  | 3 |  |  |  |  | 135 |  | 
| 31 | 3 |  |  | 3 |  | 15 | use base 'Exporter'; | 
|  | 3 |  |  |  |  | 5 |  | 
|  | 3 |  |  |  |  | 382 |  | 
| 32 |  |  |  |  |  |  |  | 
| 33 |  |  |  |  |  |  | our $VERSION = 0.02; | 
| 34 |  |  |  |  |  |  | our @EXPORT = qw(grepdir mapdir); | 
| 35 |  |  |  |  |  |  |  | 
| 36 | 3 |  |  | 3 |  | 17 | use File::Find (); | 
|  | 3 |  |  |  |  | 6 |  | 
|  | 3 |  |  |  |  | 65 |  | 
| 37 | 3 |  |  | 3 |  | 14 | use File::Spec; | 
|  | 3 |  |  |  |  | 5 |  | 
|  | 3 |  |  |  |  | 689 |  | 
| 38 |  |  |  |  |  |  |  | 
| 39 |  |  |  |  |  |  | =item mapdir { ... } $path1[, $path2...] | 
| 40 |  |  |  |  |  |  |  | 
| 41 |  |  |  |  |  |  | The block is called for each file, folder, or other filesystem entity under the | 
| 42 |  |  |  |  |  |  | given path(s).  The full path to the object is in $_.  The return value or | 
| 43 |  |  |  |  |  |  | values of the block are collected together and returned in a list. | 
| 44 |  |  |  |  |  |  |  | 
| 45 |  |  |  |  |  |  | =cut | 
| 46 |  |  |  |  |  |  |  | 
| 47 |  |  |  |  |  |  | sub mapdir(&@) { | 
| 48 | 9 |  |  | 9 | 1 | 14186 | my($closure, @paths) = @_; | 
| 49 |  |  |  |  |  |  |  | 
| 50 | 9 |  |  |  |  | 17 | my @results; | 
| 51 |  |  |  |  |  |  |  | 
| 52 |  |  |  |  |  |  | File::Find::find( | 
| 53 |  |  |  |  |  |  | { | 
| 54 |  |  |  |  |  |  | wanted => sub { | 
| 55 | 451 |  |  | 451 |  | 32259 | local $_ = $File::Find::fullname; | 
| 56 | 451 |  |  |  |  | 934 | push @results, $closure->(); | 
| 57 |  |  |  |  |  |  | }, | 
| 58 |  |  |  |  |  |  | no_chdir => 1, | 
| 59 |  |  |  |  |  |  | follow   => 1 | 
| 60 |  |  |  |  |  |  | }, | 
| 61 | 9 |  |  |  |  | 60 | map { File::Spec->rel2abs($_) } @paths | 
|  | 9 |  |  |  |  | 1460 |  | 
| 62 |  |  |  |  |  |  | ); | 
| 63 |  |  |  |  |  |  |  | 
| 64 | 9 |  |  |  |  | 386 | return @results; | 
| 65 |  |  |  |  |  |  | } | 
| 66 |  |  |  |  |  |  |  | 
| 67 |  |  |  |  |  |  | =item grepdir { ... } $path1[, $path2...] | 
| 68 |  |  |  |  |  |  |  | 
| 69 |  |  |  |  |  |  | The block is called for each file, folder, or other filesystem entity under the | 
| 70 |  |  |  |  |  |  | given path(s).  The full path to the object is in $_.  If the return value of | 
| 71 |  |  |  |  |  |  | the block is true, the full path will be in the list returned by the method. | 
| 72 |  |  |  |  |  |  |  | 
| 73 |  |  |  |  |  |  | =cut | 
| 74 |  |  |  |  |  |  |  | 
| 75 |  |  |  |  |  |  | sub grepdir(&@) { | 
| 76 | 5 |  |  | 5 | 1 | 23631 | my $predicate = shift; | 
| 77 | 5 | 100 |  | 255 |  | 24 | unshift @_, sub { $predicate->() ? $_ : () }; | 
|  | 255 |  |  |  |  | 540 |  | 
| 78 | 5 |  |  |  |  | 22 | goto &mapdir; | 
| 79 |  |  |  |  |  |  | } | 
| 80 |  |  |  |  |  |  |  | 
| 81 |  |  |  |  |  |  | =back 4 | 
| 82 |  |  |  |  |  |  |  | 
| 83 |  |  |  |  |  |  | =head1 EXPORTS | 
| 84 |  |  |  |  |  |  |  | 
| 85 |  |  |  |  |  |  | C and C by default. | 
| 86 |  |  |  |  |  |  |  | 
| 87 |  |  |  |  |  |  | =head1 AUTHOR | 
| 88 |  |  |  |  |  |  |  | 
| 89 |  |  |  |  |  |  | Brent Royal-Gordon , for the University of Kent. | 
| 90 |  |  |  |  |  |  |  | 
| 91 |  |  |  |  |  |  | =head1 LICENSE | 
| 92 |  |  |  |  |  |  |  | 
| 93 |  |  |  |  |  |  | This library is free software; you can redistribute it and/or modify it under | 
| 94 |  |  |  |  |  |  | the same terms as Perl itself. | 
| 95 |  |  |  |  |  |  |  | 
| 96 |  |  |  |  |  |  | =cut | 
| 97 |  |  |  |  |  |  |  | 
| 98 |  |  |  |  |  |  | 1; |