Directories and the File System
use v5.36;
use autodie;
opendir(my $dh, '.');
my @entries = grep { !/^\.\.?$/ } readdir $dh; # skip . and ..
closedir $dh;
my @perl_files = glob '*.pl'; # shell-style globbing
my @all_logs = glob 'logs/{app,error}*.log';
mkdir 'output';
mkdir 'output/sub' unless -d 'output/sub';
rmdir 'output/sub';
use File::Path qw(make_path remove_tree);
make_path('a/b/c');
remove_tree('a');
use Cwd qw(getcwd abs_path);
say getcwd();
chdir '/tmp';
use File::Basename qw(basename dirname fileparse);
my ($name, $dir, $suffix) = fileparse('/var/log/app.log', qr/\.[^.]*/); # ('app', '/var/log/', '.log')
use File::Spec; # portable path handling
my $path = File::Spec->catfile('dir', 'sub', 'file.txt');
# Recursive traversal
use File::Find;
find(sub {
return unless -f && /\.log$/;
say "$File::Find::name: ", -s _; # _ reuses the last stat result
}, '/var/log');
# Modern alternatives (CPAN)
use Path::Tiny;
my $iter = path('/var/log')->iterator({ recurse => 1 });
while (my $p = $iter->()) { say $p if $p =~ /\.log$/ }
path('a/b')->mkpath; path('a')->remove_tree;
say path('/etc/hosts')->basename;
use File::Find::Rule
…