in reply to Initialized Variable getting Uninitialized Warning

Never execute a my conditionally, and use then use declared variable under wider conditions. my $var = ... unless ...; ... $var ... is undefined behaviour.

Fix:

if (!$biuw->{const}{load_old}) { if ( my $exception = EcomImportUtilities::ageCheck( biuw => $biuw, feedpath => $feedfullpath, tablename => $TABLE ) ) { if ($exception->{exception} eq 'outofdate' || $exception->{exception} eq 'stillcopying ) { $biuw->{log}->warn( "$feedfullpath is out of date. " . "Loading stopped.\n"); return $exception; } elsif ($exception->{exception} eq 'nonexistent') { $biuw->{log}->warn( "$feedfullpath does not exist. " . "Loading stopped.\n"); return $exception; } } }

Replies are listed 'Best First'.
Re^2: Initialized Variable getting Uninitialized Warning
by drw (Novice) on Feb 27, 2019 at 18:17 UTC

    Thank you for the response, though I am a little confused by the solution.

    The $exception needs to be run through the EcomImportUtilities::ageCheck when the program is run, and only not when the "load old" argument is set. Why would I want that to be nested in an "if" statement? My understanding is by declaring $exception = EcomImportUtilities::ageCheck, it actually runs the subroutine. Am I mistaken? Maybe something like this instead:

    unless ($biuw->{const}{load_old}) { my $exception = EcomImportUtilities::ageCheck( biuw => $biuw, feedpath => $feedfullpath, tablename => $TABLE ) if ($exception->{exception} eq 'outofdate' || $exception->{exception} eq 'stillcopying ) { $biuw->{log}->warn( "$feedfullpath is out of date. " . "Loading stopped.\n"); return $exception; } elsif ($exception->{exception} eq 'nonexistent') { $biuw->{log}->warn( "$feedfullpath does not exist. " . "Loading stopped.\n"); return $exception; } }

    I think I understand why I am getting the undefined warning now, and I appreciate your help.

      Sure, if ageCheck always returns an exception. But then it wouldn't be an exception, would it? So either add the necessary if, or rename the variable to something that makes more sense (such as "result").

      (As for the line breaks, I added them so the code looks better on PerlMonks. There's no reason to keep them.)

        Well said, and that makes perfect sense. Thank you so much for the help! Not only does this work exactly as I needed it to, I grasped a valuable new concept in programming.