tobias_hofer has asked for the wisdom of the Perl Monks concerning the following question:
Hello Monks,
It seems I got some kind of Heisenbug. In my code, there seems to be something wrong, but I can not track it down by debuging. I got a working peace of code. Now, as I want to extend the functionality it seems that variables turning to be defined / undefined depending if going into and return from a subfunction.
It looks like this:
package DATABASE_ANALYSIS; use strict; use warnings; use diagnostics; use DBI qw(:sql_types); use DBD::SQLite; use ITF::ErrorHandling; use vars qw($VERSION $HEADER @ISA @EXPORT); use Exporter; $VERSION = q$Revision: 0.0.1 $; $HEADER = q$Header: DATABASE_ANALYSIS$; @ISA = qw(Exporter); @EXPORT = qw( ConnectToDatabase($) GetDBContent Disconnect GetParent ResolveContainer ); my ( $comp_by_pac, $container_by_pac, $containers, $src_by_comp, $src_by_test, $xml_structure, $analyzed_comps, $root_dir, $project_root, $PAC_by_Id, $COMP_by_Id, $TEST_by_Id, $COMPs_by_Name, $REL_by_Parent, $REL_by_Child, $dbh ); sub ProcessContainers { my $start_container = $_[0]; my $container; #Process PAC or COMP if given. if ( not defined $start_container ) { $start_container = $PAC_by_Id->{1}{'Name'}; } #If no token is given on command line, then the project name is #taken as standard token - script dies in case it does not exist die "Could not find Project name, try to provide project name (PAC) as tok +en! --token=MyProjectName " if ( not defined $start_container ); #Resolve all subsequent appearing PAC and STCOMP to COMPS #Background: COMPS can directly resolved to SourceFiles # 1. Get starting contianer # 2. Resolve subsequent containers if ( exists $container_by_pac->{$start_container} ) { $container = ${ $container_by_pac->{$start_container} }; } elsif ( exists $containers->{$start_container} ) { $container = $containers->{$start_container}; } #Add to xml structure $xml_structure->{$start_container} = $container; ResolveContainers($container); } sub ResolveContainers { my $start_container = $_[0]; goto COMPPROCESSING if ( ref $start_container eq 'HASH' ); foreach my $item ( @{$start_container} ) { if ( ( $item->[1] eq 'PAC' ) or ( $item->[1] eq 'STCOMP' ) ) { #Recursive analysis ResolveContainers( ${ $container_by_pac->{ $item->[0] } } +); } else { #Add Element to comps list $analyzed_comps->{ $item->[0] } = $item; } } return; COMPPROCESSING: #Add Element to comps list $analyzed_comps->{ $start_container->{'Name'} } = $start_container +; return; }
However, I am calling the ProcessContianer sub with appropriate parameter. Most important here, it is initializing the $xml_structure variable at the end. I can verify the values in the Eclipse-Debugger (EPIC plugin) and all looks fine!. Then I am calling the ResolveContainers sub. Once I am inside this function all globals (to this package) turning to undef but one $container_by_pac. Even the variable I was passing to the subfunction is listed as undef. Doing a print in the debugger is also giving me nothing -> undef.
However, once in the called ResolveContainer sub I assign the parameter which is listed as undef to the $start_container variable. It works perfect. There are all expected values. How comes it that way?
Any help is appreciated!
Best regards! Tobias
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: package variables turning suddenly to undef and back again depending on subfunction call
by Athanasius (Archbishop) on Feb 25, 2013 at 16:33 UTC | |
by tobias_hofer (Friar) on Feb 26, 2013 at 07:52 UTC | |
Re: package variables turning suddenly to undef and back again depending on subfunction call
by flexvault (Monsignor) on Feb 25, 2013 at 18:55 UTC | |
by tobias_hofer (Friar) on Feb 26, 2013 at 07:56 UTC | |
by flexvault (Monsignor) on Feb 26, 2013 at 10:28 UTC | |
by tobias_hofer (Friar) on Feb 26, 2013 at 11:40 UTC |
Back to
Seekers of Perl Wisdom