Next
Section: User Contributed Perl Documentation (3pm)
Updated: 2019-09-07
Index
Return to Main Contents
NAME
File::Next - File-finding iterator
VERSION
Version 1.18
SYNOPSIS
File::Next is a lightweight, taint-safe file-finding module.
It has no non-core prerequisites.
use File::Next;
my $files = File::Next::files( '/tmp' );
while ( defined ( my $file = $files->() ) ) {
# do something...
}
OPERATIONAL THEORY
The two major functions, files() and dirs(), return an iterator
that will walk through a directory tree. The simplest use case is:
use File::Next;
my $iter = File::Next::files( '/tmp' );
while ( defined ( my $file = $iter->() ) ) {
print $file, "\n";
}
# Prints...
/tmp/foo.txt
/tmp/bar.pl
/tmp/baz/1
/tmp/baz/2.txt
/tmp/baz/wango/tango/purple.txt
Note that only files are returned by "files()"'s iterator.
Directories are ignored.
In list context, the iterator returns a list containing $dir,
$file and $fullpath, where $fullpath is what would get
returned in scalar context.
The first parameter to any of the iterator factory functions may
be a hashref of options.
ITERATORS
For the three iterators, the \%options are optional.
files( [ \%options, ] @starting_points )
Returns an iterator that walks directories starting with the items
in @starting_points. Each call to the iterator returns another
regular file.
dirs( [ \%options, ] @starting_points )
Returns an iterator that walks directories starting with the items
in @starting_points. Each call to the iterator returns another
directory.
everything( [ \%options, ] @starting_points )
Returns an iterator that walks directories starting with the items
in @starting_points. Each call to the iterator returns another
file, whether it's a regular file, directory, symlink, socket, or
whatever.
from_file( [ \%options, ] $filename )
Returns an iterator that iterates over each of the files specified
in $filename. If $filename is "-", then the files are read
from STDIN.
The files are assumed to be in the file one filename per line. If
$nul_separated is passed, then the files are assumed to be
NUL-separated, as by "find -print0".
If there are blank lines or empty filenames in the input stream,
they are ignored.
Each filename is checked to see that it is a regular file or a named
pipe. If the file does not exists or is a directory, then a warning
is thrown to warning_handler, and the file is skipped.
The following options have no effect in "from_files": descend_filter,
sort_files, follow_symlinks.
SUPPORT FUNCTIONS
sort_standard( $a, $b )
A sort function for passing as a "sort_files" option:
my $iter = File::Next::files( {
sort_files => \&File::Next::sort_standard,
}, 't/swamp' );
This function is the default, so the code above is identical to:
my $iter = File::Next::files( {
sort_files => 1,
}, 't/swamp' );
sort_reverse( $a, $b )
Same as "sort_standard", but in reverse.
reslash( $path )
Takes a path with all forward slashes and rebuilds it with whatever
is appropriate for the platform. For example 'foo/bar/bat' will
become 'foo\bar\bat' on Windows.
This is really just a convenience function. I'd make it private,
but ack wants it, too.
CONSTRUCTOR PARAMETERS
file_filter -> \&file_filter
The file_filter lets you check to see if it's really a file you
want to get back. If the file_filter returns a true value, the
file will be returned; if false, it will be skipped.
The file_filter function takes no arguments but rather does its work through
a collection of variables.
- •
-
$_ is the current filename within that directory
- •
-
$File::Next::dir is the current directory name
- •
-
$File::Next::name is the complete pathname to the file
These are analogous to the same variables in File::Find.
my $iter = File::Next::files( { file_filter => sub { /\.txt$/ } }, '/tmp' );
By default, the file_filter is "sub {1}", or ``all files''.
This filter has no effect if your iterator is only returning directories.
descend_filter => \&descend_filter
The descend_filter lets you check to see if the iterator should
descend into a given directory. Maybe you want to skip CVS and
.svn directories.
my $descend_filter = sub { $_ ne "CVS" && $_ ne ".svn" }
The descend_filter function takes no arguments but rather does its work through
a collection of variables.
- •
-
$_ is the current filename of the directory
- •
-
$File::Next::dir is the complete directory name
The descend filter is NOT applied to any directory names specified
as @starting_points in the constructor. For example,
my $iter = File::Next::files( { descend_filter => sub{0} }, '/tmp' );
always descends into /tmp, as you would expect.
By default, the descend_filter is "sub {1}", or ``always descend''.
error_handler => \&error_handler
If error_handler is set, then any errors will be sent through
it. If the error is OS-related (ex. file not found, not permissions), the
native error code is passed as a second argument. By default, this value is
"CORE::die". This function must NOT return.
warning_handler => \&warning_handler
If warning_handler is set, then any errors will be sent through
it. By default, this value is "CORE::warn". Unlike the
error_handler, this function must return.
sort_files => [ 0 | 1 | \&sort_sub]
If you want files sorted, pass in some true value, as in
"sort_files => 1".
If you want a special sort order, pass in a sort function like
"sort_files => sub { $a->[1] cmp $b->[1] }".
Note that the parms passed in to the sub are arrayrefs, where $a->[0]
is the directory name, $a->[1] is the file name and $a->[2] is the
full path. Typically you're going to be sorting on $a->[2].
follow_symlinks => [ 0 | 1 ]
If set to false, the iterator will ignore any files and directories
that are actually symlinks. This has no effect on non-Unixy systems
such as Windows. By default, this is true.
Note that this filter does not apply to any of the @starting_points
passed in to the constructor.
You should not set "follow_symlinks => 0" unless you specifically
need that behavior. Setting "follow_symlinks => 0" can be a
speed hit, because File::Next must check to see if the file or
directory you're about to follow is actually a symlink.
nul_separated => [ 0 | 1 ]
Used by the "from_file" iterator. Specifies that the files
listed in the input file are separated by NUL characters, as from
the "find" command with the "-print0" argument.
PRIVATE FUNCTIONS
_setup( $default_parms, @whatever_was_passed_to_files() )
Handles all the scut-work for setting up the parms passed in.
Returns a hashref of operational options, combined between
$passed_parms and $defaults, plus the queue.
The queue prep stuff takes the strings in @starting_points and
puts them in the format that queue needs.
The @queue that gets passed around is an array, with each entry an
arrayref of $dir, $file and $fullpath.
_candidate_files( $parms, $dir )
Pulls out the files/dirs that might be worth looking into in $dir.
If $dir is the empty string, then search the current directory.
$parms is the hashref of parms passed into File::Next constructor.
DIAGNOSTICS
- "File::Next::files must not be invoked as File::Next->files"
-
- "File::Next::dirs must not be invoked as File::Next->dirs"
-
- "File::Next::everything must not be invoked as File::Next->everything"
-
The interface functions do not allow for the method invocation syntax and
throw errors with the messages above. You can work around this limitation
with ``can'' in UNIVERSAL.
for my $file_system_feature (qw(dirs files)) {
my $iterator = File::Next->can($file_system_feature)->($options, $target_directory);
while (defined(my $name = $iterator->())) {
# ...
}
}
SPEED TWEAKS
- •
-
Don't set "follow_symlinks => 0" unless you need it.
AUTHOR
Andy Lester, "<andy at petdance.com>"
BUGS
Please report any bugs or feature requests to
<http://github.com/petdance/file-next/issues>.
Note that File::Next does NOT use <http://rt.cpan.org> for bug tracking.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc File::Next
You can also look for information at:
- •
-
File::Next's bug queue
<http://github.com/petdance/file-next/issues>
- •
-
CPAN Ratings
<http://cpanratings.perl.org/d/File-Next>
- •
-
Search CPAN
<http://search.cpan.org/dist/File-Next>
- •
-
Source code repository
<http://github.com/petdance/file-next/tree/master>
ACKNOWLEDGEMENTS
All file-finding in this module is adapted from Mark Jason Dominus'
marvelous Higher Order Perl, page 126.
Thanks to these fine contributors:
Varadinsky,
Paulo Custodio,
Gerhard Poul,
Brian Fraser,
Todd Rinaldo,
Bruce Woodward,
Christopher J. Madsen,
Bernhard Fisseni
and Rob Hoelz.
COPYRIGHT & LICENSE
Copyright 2005-2017 Andy Lester.
This program is free software; you can redistribute it and/or modify
it under the terms of the Artistic License version 2.0.
Index
- NAME
-
- VERSION
-
- SYNOPSIS
-
- OPERATIONAL THEORY
-
- ITERATORS
-
- files( [ \%options, ] @starting_points )
-
- dirs( [ \%options, ] @starting_points )
-
- everything( [ \%options, ] @starting_points )
-
- from_file( [ \%options, ] $filename )
-
- SUPPORT FUNCTIONS
-
- sort_standard( $a, $b )
-
- sort_reverse( $a, $b )
-
- reslash( $path )
-
- CONSTRUCTOR PARAMETERS
-
- file_filter -> \&file_filter
-
- descend_filter => \&descend_filter
-
- error_handler => \&error_handler
-
- warning_handler => \&warning_handler
-
- sort_files => [ 0 | 1 | \&sort_sub]
-
- follow_symlinks => [ 0 | 1 ]
-
- nul_separated => [ 0 | 1 ]
-
- PRIVATE FUNCTIONS
-
- _setup( $default_parms, @whatever_was_passed_to_files() )
-
- _candidate_files( $parms, $dir )
-
- DIAGNOSTICS
-
- SPEED TWEAKS
-
- AUTHOR
-
- BUGS
-
- SUPPORT
-
- ACKNOWLEDGEMENTS
-
- COPYRIGHT & LICENSE
-
This document was created by
man2html,
using the manual pages.
Time: 16:23:08 GMT, April 26, 2024