Title here
Summary here
Here’s the translation of the Go code to Perl, with explanations adapted for Perl:
Our first program will demonstrate working with directories in Perl. Here’s the full source code with explanations:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Path qw(make_path remove_tree);
use File::Spec;
use Cwd;
# Helper function to check for errors
sub check {
my $err = shift;
die $err if $err;
}
# Create a new sub-directory in the current working directory
mkdir "subdir" or check($!);
# When creating temporary directories, it's good practice to remove them afterwards
END { remove_tree("subdir") }
# Helper function to create a new empty file
sub create_empty_file {
my $name = shift;
open my $fh, '>', $name or check($!);
close $fh;
}
create_empty_file("subdir/file1");
# We can create a hierarchy of directories, including parents with make_path
# This is similar to the command-line `mkdir -p`
make_path("subdir/parent/child") or check($!);
create_empty_file("subdir/parent/file2");
create_empty_file("subdir/parent/file3");
create_empty_file("subdir/parent/child/file4");
# opendir and readdir list directory contents
opendir(my $dh, "subdir/parent") or check($!);
my @entries = readdir($dh);
closedir($dh);
print "Listing subdir/parent\n";
for my $entry (@entries) {
next if $entry eq '.' or $entry eq '..';
my $is_dir = -d "subdir/parent/$entry" ? 'true' : 'false';
print " $entry $is_dir\n";
}
# chdir lets us change the current working directory, similarly to `cd`
chdir("subdir/parent/child") or check($!);
# Now we'll see the contents of `subdir/parent/child` when listing the current directory
opendir($dh, ".") or check($!);
@entries = readdir($dh);
closedir($dh);
print "Listing subdir/parent/child\n";
for my $entry (@entries) {
next if $entry eq '.' or $entry eq '..';
my $is_dir = -d $entry ? 'true' : 'false';
print " $entry $is_dir\n";
}
# `cd` back to where we started
chdir("../../..") or check($!);
# We can also visit a directory recursively, including all its sub-directories
print "Visiting subdir\n";
visit("subdir");
sub visit {
my $dir = shift;
opendir(my $dh, $dir) or check($!);
while (my $entry = readdir($dh)) {
next if $entry eq '.' or $entry eq '..';
my $path = File::Spec->catfile($dir, $entry);
my $is_dir = -d $path ? 'true' : 'false';
print " $path $is_dir\n";
visit($path) if -d $path;
}
closedir($dh);
}
To run the program, save it as directories.pl
and use:
$ perl directories.pl
Listing subdir/parent
child true
file2 false
file3 false
Listing subdir/parent/child
file4 false
Visiting subdir
subdir true
subdir/file1 false
subdir/parent true
subdir/parent/child true
subdir/parent/child/file4 false
subdir/parent/file2 false
subdir/parent/file3 false
This Perl script demonstrates various operations with directories, including creating directories, listing their contents, changing the current working directory, and recursively visiting a directory tree. It uses Perl’s built-in functions and modules like File::Path
and File::Spec
to handle these operations in a cross-platform manner.