Slices in Perl

Slices in Perl are typically implemented using arrays. While Perl doesn’t have a built-in slice type like Go, we can achieve similar functionality using arrays and array references.

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

# Unlike Go slices, Perl arrays are not typed by their elements.
# An uninitialized array in Perl is empty but not nil.
my @s;
print "uninit: ", Dumper(\@s), "is empty: ", (scalar(@s) == 0 ? "true" : "false"), "\n";

# To create an empty array with non-zero length, we can use the $#array syntax
$#s = 2;
print "emp: ", Dumper(\@s), "len: ", scalar(@s), "\n";

# We can set and get just like with arrays
$s[0] = "a";
$s[1] = "b";
$s[2] = "c";
print "set: ", Dumper(\@s);
print "get: ", $s[2], "\n";

# scalar(@array) returns the length of the array
print "len: ", scalar(@s), "\n";

# To append to an array in Perl, we can use the push function
push @s, "d";
push @s, ("e", "f");
print "apd: ", Dumper(\@s);

# To copy an array in Perl, we can use the = operator
my @c = @s;
print "cpy: ", Dumper(\@c);

# Perl has built-in slice syntax using the [] operator
my @l = @s[2..4];
print "sl1: ", Dumper(\@l);

# This slices up to (but excluding) index 5
@l = @s[0..4];
print "sl2: ", Dumper(\@l);

# And this slices from index 2 to the end
@l = @s[2..$#s];
print "sl3: ", Dumper(\@l);

# We can declare and initialize an array in a single line
my @t = ("g", "h", "i");
print "dcl: ", Dumper(\@t);

# To compare arrays in Perl, we can use the List::Util module
use List::Util qw(all);
my @t2 = ("g", "h", "i");
if (all { $t[$_] eq $t2[$_] } 0..$#t) {
    print "t == t2\n";
}

# Multidimensional arrays in Perl are typically implemented using references
my @twoD;
for my $i (0..2) {
    my $innerLen = $i + 1;
    for my $j (0..$innerLen-1) {
        $twoD[$i][$j] = $i + $j;
    }
}
print "2d: ", Dumper(\@twoD);

This Perl code demonstrates concepts similar to Go’s slices, using Perl’s array functionality. Here are some key differences and notes:

  1. Perl doesn’t have a separate slice type; arrays are used for similar purposes.
  2. Perl arrays are not typed by their elements.
  3. The scalar(@array) function is used to get the length of an array.
  4. Perl uses push to append to arrays, similar to Go’s append.
  5. Perl has built-in slice syntax using the [] operator.
  6. Multidimensional arrays in Perl are typically implemented using references.
  7. The Data::Dumper module is used for easy printing of complex data structures.
  8. The List::Util module is used for array comparison, as Perl doesn’t have a built-in array equality operator.

When you run this Perl script, you’ll see output similar to the Go example, demonstrating various array operations and manipulations.