Aion-Fs
view release on metacpan or search on metacpan
lib/Aion/Fs.pm view on Meta::CPAN
[map cat, grep -f, find ["hello/big", "hello/small"]]; # --> [qw/ hellow! noenter /]
my @noreplaced = replace { s/h/$a $b H/ }
find "hello", "-f", "*.txt", qr/\.txt$/, sub { /\.txt$/ },
noenter "*small*",
errorenter { warn "find $_: $!" };
\@noreplaced; # --> ["hello/moon.txt"]
cat "hello/world.txt"; # => hello/world.txt :utf8 Hi!
cat "hello/moon.txt"; # => noreplace
cat "hello/big/world.txt"; # => hello/big/world.txt :utf8 Hellow!
cat "hello/small/world.txt"; # => noenter
[find "hello", "*.txt"]; # --> [qw! hello/moon.txt hello/world.txt hello/big/world.txt hello/small/world.txt !]
my @dirs;
my $iter = find "hello", "-d";
while(<$iter>) {
push @dirs, $_;
}
\@dirs; # --> [qw! hello hello/big hello/small !]
erase reverse find "hello";
-e "hello"; # -> undef
=head1 DESCRIPTION
This module makes it easier to use the file system.
Modules C<File::Path>, C<File::Slurper> and
C<File::Find> is burdened with various features that are rarely used, but require time to become familiar with and thereby increase the barrier to entry.
C<Aion::Fs> uses the KISS programming principle - the simpler the better!
The C<IO::All> supermodule is not a competitor to C<Aion::Fs>, because uses an OOP approach, and C<Aion::Fs> is FP.
=over
=item * OOP â object-oriented programming.
=item * FP â functional programming.
=back
=head1 SUBROUTINES/METHODS
=head2 cat ($file)
Reads the file. If no parameter is specified, use C<$_>.
cat "/etc/passwd" # ~> root
C<cat> reads with layer C<:utf8>. But you can specify another layer like this:
lay "unicode.txt", "â¯";
length cat "unicode.txt" # -> 1
length cat["unicode.txt", ":raw"] # -> 3
C<cat> throws an exception if the I/O operation fails:
eval { cat "A" }; $@ # ~> cat A: No such file or directory
=head3 See also
=over
=item * L<autodie> â C<< open $f, "r.txt"; $s = join "", E<lt>$fE<gt>; close $f >>.
=item * L<File::Slurp> â C<read_file('file.txt')>.
=item * L<File::Slurper> â C<read_text('file.txt')>, C<read_binary('file.txt')>.
=item * L<File::Util> â C<< File::Util-E<gt>new-E<gt>load_file(file =E<gt> 'file.txt') >>.
=item * L<IO::All> â C<< io('file.txt') E<gt> $contents >>.
=item * L<IO::Util> - C<$contents = ${ slurp 'file.txt' }>.
=item * L<Mojo::File> â C<< path($file)-E<gt>slurp >>.
=back
=head2 lay ($file?, $content)
Writes C<$content> to C<$file>.
=over
=item * If one parameter is specified, use C<$_> instead of C<$file>.
=item * C<lay>, uses the C<:utf8> layer. To specify a different layer, use an array of two elements in the C<$file> parameter:
=back
lay "unicode.txt", "â¯" # => unicode.txt
lay ["unicode.txt", ":raw"], "â¯" # => unicode.txt
eval { lay "/", "â¯" }; $@ # ~> lay /: Is a directory
=head3 See also
=over
=item * L<autodie> â C<< open $f, "E<gt>r.txt"; print $f $contents; close $f >>.
=item * L<File::Slurp> â C<write_file('file.txt', $contents)>.
=item * L<File::Slurper> â C<write_text('file.txt', $contents)>, C<write_binary('file.txt', $contents)>.
=item * L<IO::All> â C<< io('file.txt') E<lt> $contents >>.
=item * L<IO::Util> â C<slurp \$contents, 'file.txt'>.
=item * L<File::Util> â C<< File::Util-E<gt>new-E<gt>write_file(file =E<gt> 'file.txt', content =E<gt> $contents, bitmask =E<gt> 0644) >>.
=item * L<Mojo::File> â C<< path($file)-E<gt>spew($chars, 'UTF-8') >>.
=back
=head2 find (;$path, @filters)
Recursively traverses and returns paths from the specified path or paths if C<$path> is an array reference. Without parameters, uses C<$_> as C<$path>.
Filters can be:
=over
=item * By subroutine - the path to the current file is passed to C<$_>, and the subroutine must return true or false, as understood by Perl.
=item * Regexp â tests each path with a regular expression.
=item * String in the form "-Xxx", where C<Xxx> is one or more characters. Similar to Perl operators for testing files. Example: C<-fr> checks the path with file testers LLL<https://perldoc.perl.org/functions/-X>.
=item * The remaining lines are turned by the C<wildcard> function (see below) into a regular expression to test each path.
=back
Paths that fail the C<@filters> check are not returned.
If the -X filter is not a perl file function, an exception is thrown:
eval { find "example", "-h" }; $@ # ~> Undefined subroutine &Aion::Fs::h called
In this example, C<find> cannot enter the subdirectory and passes an error to the C<errorenter> function (see below) with the C<$_> and C<$!> variables set (to the directory path and the OS error message).
B<Attention!> If C<errorenter> is not specified, then all errors are B<ignored>!
mkpath ["example/", 0];
[find "example"] # --> ["example"]
[find "example", noenter "-d"] # --> ["example"]
eval { find "example", errorenter { die "find $_: $!" } }; $@ # ~> find example: Permission denied
mkpath for qw!ex/1/11 ex/1/12 ex/2/21 ex/2/22!;
( run in 0.940 second using v1.01-cache-2.11-cpan-d7f47b0818f )