Slash Boxes
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

dami (6728)

  (email not shown publicly)

Journal of dami (6728)

Tuesday May 22, 2007
04: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;


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.
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] }