Stories
Slash Boxes
Comments

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

dami (6728)

dami
  (email not shown publicly)

Journal of dami (6728)

Tuesday May 22, 2007
05:53 AM

operators : defined-or, assign-or

[ #33328 ]
I'm waiting eagerly for the "defined-or" operator in Perl 5.10

$val = expr1 // expr2 ;
$val //= expr;

But I'm also missing something else : conditional assignment. I would love to be able to write something like

$some_hash{some_key} =? expr;

meaning

my $tmp;
$tmp = expr and $some_hash{some_key} = $tmp;

so put a new key in the hash only if the value is true. Right now I just write my code with $tmp = ... and .., but that's ugly ... any more clever idiom, anybody ?

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • Don't put a conditional into an assignment operator. What would be the return value of =? ? What would "$x = $y =? $z" do ?
    • > What would be the return value of =? ?

      Just what I wrote in original post : ($x =? expr) would mean
      ($tmp = expr and $x = $tmp)

      > What would "$x = $y =? $z" do ?
      $x = ($tmp = $z and $y = $tmp)

      so if $z is false, $y is untouched and $x is false, whereas with

      "$x =? $y =? $z"

      both $x and $y stay untouched if $z is false
    1. eval { $some_hash{some_key} = ( expr or die ) };
    2. $_ = expr or $_ for $some_hash{some_key};
    • > eval { $some_hash{some_key} = ( expr or die ) };
      this would catch exceptions raised in expr .

      > $_ = expr or $_ for $some_hash{some_key};
      well, not many readers would quickly guess that we are assigning something in the hash here

      • My suggestions were actually tongue-in-cheek, particularly the eval-based one. I would never write code like that.

        But it occurs to me that you can just as well arrange the aliasing in #2 the other way around:

        $_ and $foo{bar} = $_ for $baz;

        Unlike my previous suggestion this also avoids the unnecessary assignment in case the expression is false. I might actually use this in real code, although I would probably not write it with if and a for construct rather than the for modifier.

        for ( expr ) { $foo{ba

  • Luckily perl has pass-by-reference that plays well with autovivification:

    sub update { $_[0] = $_[1] if $_[1]; $_[1] }