The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

$File::Slurp::Tiny::VERSION = '0.004';
use strict;
use Carp 'croak';
use Exporter 5.57 'import';
use File::Spec::Functions 'catfile';
our @EXPORT_OK = qw/read_file read_lines write_file read_dir/;
my $default_layer = $^O eq 'MSWin32' ? ':crlf' : ':unix';
sub read_file {
my ($filename, %options) = @_;
my $layer = $options{binmode} || $default_layer;
my $buf_ref = defined $options{buf_ref} ? $options{buf_ref} : \my $buf;
open my $fh, "<$layer", $filename or croak "Couldn't open $filename: $!";
if (my $size = -s $fh) {
my ($pos, $read) = 0;
do {
defined($read = read $fh, ${$buf_ref}, $size - $pos, $pos) or croak "Couldn't read $filename: $!";
$pos += $read;
} while ($read && $pos < $size);
}
else {
${$buf_ref} = do { local $/; <$fh> };
}
close $fh;
return if not defined wantarray or $options{buf_ref};
return $options{scalar_ref} ? $buf_ref : $buf;
}
sub read_lines {
my ($filename, %options) = @_;
my $layer = delete $options{binmode} || ':';
open my $fh, "<$layer", $filename or croak "Couldn't open $filename: $!";
return <$fh> if not %options;
my @buf = <$fh>;
close $fh;
chomp @buf if $options{chomp};
return $options{array_ref} ? \@buf : @buf;
}
sub write_file {
my ($filename, undef, %options) = @_;
my $layer = $options{binmode} || $default_layer;
my $mode = $options{append} ? '>>' : '>';
my $buf_ref = defined $options{buf_ref} ? $options{buf_ref} : \$_[1];
open my $fh, $mode.$layer, $filename or croak "Couldn't open $filename: $!";
$fh->autoflush(1);
print $fh ${$buf_ref} or croak "Couldn't write to $filename: $!";
close $fh or croak "Couldn't close $filename: $!";
return;
}
sub read_dir {
my ($dirname, %options) = @_;
opendir my ($dir), $dirname or croak "Could not open $dirname: $!";
my @ret = grep { not m/ \A \.\.? \z /x } readdir $dir;
@ret = map { catfile($dirname, $_) } @ret if $options{prefix};
closedir $dir;
return @ret;
}
1;
# ABSTRACT: A simple, sane and efficient file slurper [DISCOURAGED]
__END__
=pod
=encoding UTF-8
=head1 NAME
File::Slurp::Tiny - A simple, sane and efficient file slurper [DISCOURAGED]
=head1 VERSION
version 0.004
=head1 SYNOPSIS
use File::Slurp::Tiny 'read_file';
my $content = read_file($filename);
=head1 DISCOURAGED
B<This module is discouraged in favor of L<File::Slurper|File::Slurper>>. While a useful experiment, it turned out to be both too similar to File::Slurp (still containing most problematic features of File::Slurp's interface) and yet not similar enough to be a true drop-in replacement.
Bugs will still be fixed, but new features will probably not be added.
=head1 DESCRIPTION
This module provides functions for fast and correct slurping and spewing. All functions are optionally exported.
=head1 FUNCTIONS
=head2 read_file($filename, %options)
Reads file C<$filename> into a scalar. By default it returns this scalar. Can optionally take these named arguments:
=over 4
=item * binmode
Set the layers to read the file with. The default will be something sensible on your platform.
=item * buf_ref
Pass a reference to a scalar to read the file into, instead of returning it by value. This has performance benefits.
=item * scalar_ref
If set to true, C<read_file> will return a reference to a scalar containing the file content.
=back
=head2 read_lines($filename, %options)
Reads file C<$filename> into a list/array. By default it returns this list. Can optionally take these named arguments:
=over 4
=item * binmode
Set the layers to read the file with. The default will be something sensible on your platform.
=item * array_ref
Pass a reference to an array to read the lines into, instead of returning them by value. This has performance benefits.
=item * chomp
C<chomp> the lines.
=back
=head2 write_file($filename, $content, %options)
Open C<$filename>, and write C<$content> to it. Can optionally take this named argument:
=over 4
=item * binmode
Set the layers to write the file with. The default will be something sensible on your platform.
=back
=head2 read_dir($dirname, %options)
Open C<dirname> and return all entries except C<.> and C<..>. Can optionally take this named argument:
=over 4
=item * prefix
This will prepend C<$dir> to the entries
=back
=head1 SEE ALSO
=over 4
=item * L<Path::Tiny>
A minimalistic abstraction not only around
=item * L<File::Slurp>
Another file slurping tool.
=back
=head1 AUTHOR
Leon Timmermans <leont@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2013 by Leon Timmermans.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut