in reply to Text::ExtractWords exhibits incomprehensible behavior?

Consider:

use strict; use warnings; my @powers = map{undef} 0 .. 3; my $x = 2; powers ($x, @powers); print("$x @powers\n"); sub powers { $_[$_] = $_[$_ - 1] * $_[0] for 1 .. @_ - 1; }

Prints:

2 4 8 16 32

Perl effectively passes parameters by reference. Arrays and hashes get flattened so each element becomes a parameter.

Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond

Replies are listed 'Best First'.
Re^2: Text::ExtractWords exhibits incomprehensible behavior?
by Danny (Chaplain) on Jun 16, 2024 at 21:56 UTC
    Or perhaps more clearly:
    my $me = "old me"; s1($me); print "$me\n"; sub s1 { $_[0] = "new me"; }
    But it's customary to make local copies of the parameters like 'my $var = shift' so they don't get changed.
      I had no idea this was possible.

      So, I could create a version of `trim` that was more `chomp`-like?

      sub mytrim { $_[0] =~ s/^\s+|\s+$//g; } my $text = ' this could use a trim. '; mytrim $text;
        Yes, @_ is always an alias for the actual variables that were passed to the function. It's generally bad to modify the caller's variables, but in some cases it gives a nice performance boost.

        Since you're just learning this, you should also know that for-loops do the same thing, even if you declare the loop variable with 'my'. IMHO they should have made it so that 'for my' de-aliases the loop item, and a different syntax for the (more efficient) aliasing behavior. Perl didn't have an internal copy-on-write back then though, so this was probably done for efficiency even though it's a bit of a foot-gun.

        sub modify_it { $_[0]= 11; } my $x= 10; for my $y ($x) { modify_it($y); } say $x; // $x is now 11