in reply to passing array ref without variable

Yes, that does work. What does not work so easily is when you want to pass the values of a hash to the function in such a way that it can write them. Eg. this works, the function can change the value in the hash:

my %d = ("foo", "bar"); sub fs { $_[0] = "quux"; } fs(values %d); prin +t join(" ", %d), $/; # OUTPUT: foo quux

But this does not work:

my %d = ("foo", "bar"); sub fi { ${$_[0]}[0] = "quux"; } fi([values %d +]); print join(" ", %d), $/; # OUTPUT: foo bar

Instead you could do

my %d = ("foo", "bar"); sub fi { ${$_[0]}[0] = "quux"; } sub capture { + \@_ } fi(capture(values %d)); print join(" ", %d), $/; # OUTPUT: foo quux

But that's probably all irrelevant to your question.