in reply to What about if (my $var = foo()) { ... }

I think you have eaten too much Christmas pudding :) You seem to be thinking the following constructs are equivalent:

These constructs are hardly equivalent and there is no ambiguity that needs to be cleaned up, regardless of whether they happen to appear within a conditional.

A lexical declared within an if is not prone to the my $foo if 0 persistency problem, period. Consider the construct

if (my $result = some_func())

assuming some_func() is some sort of cyclic iterator that returns a positive number, then 0, then undef, the if branch will be taken only when $result contains a positive number. If $result contains 0 or undef, the conditional will evaluate to false, and the else branch (if any) will be taken instead.

At no point will $result retain its previous contents. Even if it did at a purely implementational level, you're initialising it with a value via the assignment of the results of some_funct(), and so you're safe.

• another intruder with the mooring in the heart of the Perl

Replies are listed 'Best First'.
Re^2: What about if (my $var = foo()) { ... }
by Limbic~Region (Chancellor) on Dec 29, 2007 at 16:12 UTC
    grinder,
    No, I assure you I know they are different and completely understand why postfix is wrong. Please read my response to dragonchild. My questions are specific to this construct.

    The reason we don't do:

    if (some_func()) { my $val = some_func(); }
    Is because some_func may change return values in subsequent invocations. The reason why we don't do:
    my $val = some_func(); if ($val) { # ... }
    Is because we want $val scoped as small as possible.

    This only works because of the implicit scoping in perl 5 which is going away in perl 6 (at least in for blocks). I am wondering if there is an alternative way of writing this that accomplishes both things.

    Cheers - L~R

      if you want to avoid:
      if (my $val = some_func()) { # ... }
      and keep as small a scope as possible, how about:
      { my $val = some_func(); if ($val) { # ... } }


      John