This answer is complementary to the other answers. I'll wander around your question on the assumption that you and other readers are interested in some possibilities of an FPish approach that eschews purism.
my @a = ^5; # @a bound to an Array
@a.map(* ** 2) .put; # 0 1 4 9 16
@a.put; # 0 1 2 3 4 <- Array unchanged
@a.map(* **= 2) .put; # 0 1 4 9 16
@a.put; # 0 1 4 9 16 <- Array changed
@a := @a.List; # rebind @a to a List
@a.map(* ** 2) .put; # 0 1 16 81 256 <- Same as if Array
@a.put; # 0 1 4 9 16 <- List unchanged
@a.map(* **= 2) .put; # Cannot assign to an immutable value
The Array examples show how you can optionally mutate en passant. (It does so using a binary (infix) op in the form op= instead of just op but if that's confusing just note the effect and ignore the syntax.)
En passant mutation is a much more "evil" side effect than mere .puting, such that a purist would be kinda horrified if someone called it "functional" style. Not me of course. :)
And the List example goes in the other direction, moving toward immutability. Lists are immutable wannabes.
Again, those into FP will likely laud their immutability. Purists will denigrate the wannabe aspect. Perl folk will likely see it both ways.
Immutable wannabes
A List is either entirely or mostly immutable.
You can never push or pop a List.
It's length is always immutable.
A list of basic values is fully immutable:
my $really-immutable-list = (1,2,'foo', 1.5, (3,4,5));
The exception is that if an element of a list is itself mutable then you can mutate it and thus mutate the List:
my $only-shallowly-immutable-list = (1,2,'foo', 1.5, [3,4,5]);
$only-shallowly-immutable-list[4][1] = 9;
say $only-shallowly-immutable-list; # (1 2 foo 1.5 [3 9 5])
More subtly:
class c { has $.foo; method waldo { $!foo = 42 } }
my $bar = c.new;
my $list = ($bar, 2);
say $list; # (c.new(foo => Any) 2)
$bar.waldo;
say $list; # (c.new(foo => 42) 2)