in reply to scope of variables in a sub

Replace this:

elsif(($vsowner) = ($_ =~ /vs_owner =\s+(.*)/)){ print "VSOWNER:$vsowner\n"; }

With this:

elsif ( /vs_owner =\s+(.*)/ ){ $vsowner = $1; print "VSOWNER:$vsowner\n"; }

Your problem is that $vsowner is being set on one iteration of the loop, but being unset the next time around the loop.

Fix your other if/elsif checks too.

Replies are listed 'Best First'.
Re^2: scope of variables in a sub
by GrandFather (Saint) on Sep 24, 2020 at 00:39 UTC

    Well spotted! Assignment in an if condition is just too smelly for my brain to process.

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

      Assignment in an if is fine if you're doing:

      if ( my $var = something() ) { # use $var here }

      (Ditto while.)

      But if $var has a wider scope, it's probably a bad idea.

        Even then there are two major issues to my mind:

        1. The clutter around the assignment hides the assignment making it harder to see where the variable gets its value
        2. It is easy to confuse = and == so using the assignment operator in a conditional expression makes code harder to maintain

        Point 2 is seen as sufficient of an issue that many compilers generate warnings for assignment in conditional expressions. I love the way that Perl allows terse functional chords that allow the equivalent of many lines of code in other languages to be wrapped up in a single compact statement. But playing tricks with side effects just to save a line of code doesn't sit well with me.

        I'm completely fine with the equivalent assignment in a while statement though - go figure.

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

      Yup. OP must be doing just this. xD

Re^2: scope of variables in a sub
by frontrange (Initiate) on Sep 24, 2020 at 03:09 UTC
    DOAH!

    Thanks, I should have seen that. Too little sleep last night, brain fog.