in reply to Re^2: No garbage collection for my-variables
in thread No garbage collection for my-variables

Agreed a thousand times over. If I had a penny for every time I'd been forced to write tedious and ugly code because chomp modifies its argument instead of returning the chomped version, I'd have several pennies.

Replies are listed 'Best First'.
Re^4: No garbage collection for my-variables
by ikegami (Patriarch) on Sep 17, 2008 at 03:02 UTC
    Are
    chomp( my $var = <$fh> );

    and

    chomp( my $dst = $src );
    really more tedious and uglier than
    my $var = chomp( scalar ( <$fh> ) );

    and

    my $dst = chomp( $src );

      They are. funcall(<variable assignment>) is a useful idiom in programming languages where assigment returns (an alias to) the value of the variable, but it is counter-intuitive at first. Even though I have been programming in Perl and curly brace block syntax languages for years, I still find it hard to read -- mostly because when you normally delimit my with braces, you create a new lexical scope. That's what chomp(my $foo = bar) still seems to be, even if I know better and use the idiom frequently.

      Not only that, but it is not obvious that the value of $var in chomp(my $var = <$fh>) is being modified at all! After all, assignment, if used in other contexts, returns the value, not a reference to it. my $foo = $bar = 1 doesn't create a reference in $foo, but sets the value of both variables to 1. In fact, I am not sure what the underlying mechanism is. Does it work because assignment returns an alias similar to aliased values in @_ in function calls?

      Side-effect free chomp has no similar conceptual problems.

      --
      say "Just Another Perl Hacker";