develooper Front page | perl.beginners | Postings from April 2002

RE: Debugging and 'uninitialized value in concatenation' question

Thread Previous | Thread Next
Jason Frisvold
April 25, 2002 14:01
RE: Debugging and 'uninitialized value in concatenation' question
Message ID:
Ok, shoot me now...  I tried to provide an example and I blew it..
*grin*  I realize that the locals are block scope..  I know what I
meant, just didn't say it..  :)

I understand that you cannot access a local variable outside it's
scope..  Hrm.. ok, try this :

sub dummy {
	my $a;
	if ($b == 1) { $a = 2; }
	print "$a\n";

Now..  If $b is 1, then $a gets set to 2 and everything is great.
However, if not, $a stays unintialized (which I believe is null) and I
get that 'uninitialized value' error...

I think I'm answering my own question, though...  always initialize the
variable and stupid stuff like this won't happen...

Jason H. Frisvold
Senior ATM Engineer
Engineering Dept.
CCNA Certified - CSCO10151622
"Imagination is more important than knowledge. Knowledge is limited.
Imagination encircles the world." -- Albert Einstein [1879-1955]

-----Original Message-----
From: Jenda Krynicky [] 
Sent: Thursday, April 25, 2002 4:17 PM
Subject: Re: Debugging and 'uninitialized value in concatenation'

From: "Jason Frisvold" <>
> Judging from the subject lines coming across the list today, I think
> I'm gonna toss this question out there and then duck and cover...  :-)

We do not shoot at people here. Even if they do provide the missile 
address. ;-)
> Question #1.
> When I'm writing code, I want to be able to view as much output as
> possible so I can trace through everything and ensure that it is,
> indeed, running correctly.  I've gone as far as writing my own debug
> module that uses "levels" and outputs everything in color.
> (Term::ANSIColor is a lot of fun to play with)...  One major side
> effect of this is that my code will begin to run slower due to all of
> the debugging...
> So, the obvious answer is to turn off the debugging.  However, even
> with my magic "debug off switch" (see below for a better explanation),
> the calls to the debug routines are still being made.  Is there any
> sort of #IFDEF that can be done in perl, or do I actually have to
> comment out (or remove) each call?
> My magic "debug off switch" is nothing more than a simple if/then
> statement.  It works on the principle that if $IDebugLevel is a
> positive integer greater than 0, then I want to debug.

You may mark them somehow and then process your script with 
something that'll comment them out or strip them entirely.


> Question #2.
> Relating to the debugging, there are several instances where I have
> variables that are only defined based on the definition of other
> variables that exist elsewhere.  Kind of like :
> sub dummy {
> if ($a == 10) { my $b = 0; }
> }
> $b is a local variable, so whenever the subroutine is exited, $b
> vanishes into the ether.  

In this case the difference is not visible, but still ... please keep in

mind that the scope of a variable is a block, not a subroutine!

	sub foo {
		if (1 > 2) {
			my $x = 1;
		print "\$x=$x\n";
will NOT print

I hope you DO
	use strict;

> The problem is that I have $b in several
> debug statements because I want to see it when it's used, but I don't
> want to have to create a huge if/then structure to determine what
> variables are being used.

No you cannot acces a lexical variable (declared with my()) outside 
its scope. The only kind-of exception are closures ... subroutines 
defines inside the variable's scope and thus able to access it later. 
But that's not what you want.

=========== == ==========
There is a reason for living. There must be. I've seen it somewhere.
It's just that in the mess on my table ... and in my brain
I can't find it.
					--- me

To unsubscribe, e-mail:
For additional commands, e-mail:

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About