Front page | perl.beginners |
Postings from April 2002
RE: Debugging and 'uninitialized value in concatenation' question
Thread Previous
|
Thread Next
From:
Jason Frisvold
Date:
April 26, 2002 08:44
Subject:
RE: Debugging and 'uninitialized value in concatenation' question
Message ID:
AFC704CE41DA93429C9411A6DD93F07501770C9E@EXCHANGE5.corp.ptd.net
While this appears to be a decent solution, I think I would still
encounter the same problem that I wanted to avoid... Every time it
encounters a CPP statement (#IF DEBUG, #DEFINE, etc) then it still needs
to make the proper calls and whatnot... Whereas in C, since it's
compiled, the pre-processor strips out the debug junk where appropriate
as per your defines...
I don't think the solution I want exists since this is not a compiled
language... Other than writing a pre-processor style program that
manually strips out the debug stuff I don't want...
Hrm.. I wonder if I can make a module for CVS that will do this..
---------------------------
Jason H. Frisvold
Senior ATM Engineer
Engineering Dept.
Penteledata
CCNA Certified - CSCO10151622
friz@corp.ptd.net
---------------------------
"Imagination is more important than knowledge. Knowledge is limited.
Imagination encircles the world." -- Albert Einstein [1879-1955]
-----Original Message-----
From: Chas Owens [mailto:cowens@intercall.com]
Sent: Friday, April 26, 2002 10:46 AM
To: Jason Frisvold
Cc: beginners@perl.org
Subject: Re: Debugging and 'uninitialized value in concatenation'
question
On Thu, 2002-04-25 at 14:49, Jason Frisvold wrote:
> 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... :-)
>
> I have 2 actual questions. I'll try to be as specific as possible..
> :-)
>
> 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 can use cpp (the c preprocessor) with a filter like this:
#!/usr/bin/perl -w
use strict;
use Filter::cpp; #from the Filter module on CPAN
#DEFINE DEBUG 1
print "this is normal code\n";
#IF DEBUG
print "this is debug code that simply goes away
when DEBUG is set to 0.\n"
#END IF
If you are on a system that doesn't have cpp (almost all Unix boxen
have cpp in one form or another) you can still roll your own filter
similar to this:
<example>
package DEBUG;
use Filter::Util::Call;
use Carp;
sub unimport {
my ($type, @other_args) = @_;
my $in_debug = 0;
filter_add (sub {
$l++;
my $status = filter_read;
croak "unbalenced '#DEBUG'" if $status == 0 and
$in_debug;
if (/^\s*#DEBUG ON/) {
carp "nested #DEBUG ON is dangerous" if
++$in_debug > 1;
} elsif (/^\s*#DEBUG OFF/) {
croak "unbalenced '#DEBUG'" if --$in_debug < 0;
} else {
s/^/#/ if ($in_debug);
}
return $status;
});
}
sub import {
filter_del();
}
1;
</example>
This module will allow you to say things like:
<example>
#!/usr/bin/perl
use lib '.';
no DEBUG; #turn off debugging code
my $test = 0;
#DEBUG ON
print "This should not be printed if no DEBUG is used\n";
#DEBUG OFF
print "this should always print\n";
use DEBUG; #turn debug code back on
#this code should execute
#DEBUG ON
print "this should only show up if no DEBUG is not in effect\n";
$test = 10;
#DEBUG OFF
no DEBUG; #turn debug back off
#DEBUG ON
print "This shouldn't be printed because of the no DEBUG above\n";
#DEBUG OFF
print "this \$test = ($test)\n"
</example>
> 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. 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.
>
> So, the general question becomes, how should variables like this be
> handled? Should I be initializing them every iteration even if they
go
> unused, or should I be using some sort of defined() statement? What
is
> the "proper" way to handle this in perl? If this was C, I would have
to
> say that the variables are declared each time... I'm just curious if
> there's a better way to handle this in perl...
>
>
> TIA,
>
>
> ---------------------------
> Jason H. Frisvold
> Senior ATM Engineer
> Engineering Dept.
> Penteledata
> CCNA Certified - CSCO10151622
> friz@corp.ptd.net
> ---------------------------
> "I love deadlines. I especially like the whooshing sound they make as
> they go flying by." -- Douglas Adams [1952-2001]
>
>
--
Today is Sweetmorn the 43rd day of Discord in the YOLD 3168
You are what you see.
Missile Address: 33:48:3.521N 84:23:34.786W
Thread Previous
|
Thread Next