perlquestion
tobias_hofer
<p>
Hello Monks,<br>
<br>
It seems I got some kind of <strong> Heisenbug</strong>. 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.
</p>
<p>It looks like this:<br>
<readmore>
<code>
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 token! --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;
}
</code>
</readmore>
Notice the global variables in the package. They are defined by calling other functions not put into this code collection here.<br>
<br>
However, I am calling the <code>ProcessContianer</code> sub with appropriate parameter. Most important here, it is initializing the <strong> <code>$xml_structure</code> </strong> variable at the end. I can verify the values in the Eclipse-Debugger (EPIC plugin) and all looks fine!. Then I am calling the <code>ResolveContainers</code> sub. Once I am inside this function all globals (to this package) turning to undef but one <code>$container_by_pac</code>. 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.</p>
<p>
However, once in the called <code>ResolveContainer</code> sub I assign the parameter which is listed as undef to the <code>$start_container</code> variable. It works perfect. There are all expected values. How comes it that way?
</p>
<p> Any help is appreciated!</p>
<p> Best regards! Tobias </p>