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

RE: Debugging and 'uninitialized value in concatenation' question

Thread Previous | Thread Next
From:
Chas Owens
Date:
April 26, 2002 12:54
Subject:
RE: Debugging and 'uninitialized value in concatenation' question
Message ID:
1019850523.2722.60.camel@tert.icallinc.com
On Fri, 2002-04-26 at 14:51, Jason Frisvold wrote:
> Hrm..  I'll run some tests with it and see what I find out...  Sounds
> promising if it really is a preprocessor...  So does it just do
> something along the lines of a cat <file> | grep -v <stuff> and then
> execute the output?  (I realize that is simplifying it by a great deal)
> 
> I'm just trying to wrap my head around this...  The program (actually
> programs) that I've been writing runs anywhere from once every 5 minutes
> to once a night...  I know I can make it faster by porting to C, but
> it's that much easier to do in perl.  However, I don't want to waste
> cycles running through a preprocessor every time, or running through a
> debug routing every time when it's not needed...
> 
> Hrm...  more thought needed..  *grin*
> 
> ---------------------------
> 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]

It will run through the filter every time it is executed so a program
with a filter will be slower than a program without a filter.  Filters
work by using BEGIN blocks and some really neat backend magic.  Here is
an example filter (with new comments) I wrote based on your earlier
email.  In fact, come to think of it, if you reverse the import and
unimport subs, reverse substitution (s//^#/), and remember to comment
out the debug code your production code will run a top speed and your
debug code will be a little slower instead of the other way around.

#name the module
package DEBUG;

#all of the magic comes from this module
use Filter::Util::Call;

#minor magic that makes warns and dies report as if the code
#were in the calling file
use Carp;

#unimport gets called when you say "no MODULENAME;"
#I am using it here for my main filter because I
#want to be able to say "no DEBUG;" instead of 
#"use DEDEBUG;" or other negative name.
sub unimport {
	#grab the args passed into the module (ignore)
	my ($type, @other_args) = @_;

	#this variable determines whether we are in
	#a chunk of code that needs to be commented
	my $in_debug      = 0;

	#filter_add sets up the filter.  There are two
	#ways to use it, I am using the closure method
	#because I think closures rock.  The anonymous 
	#subroutine I define here will be called until
	#there is no more data is left in the file, an
	#error occurs, or the filter_del sub is called
	filter_add (sub {

		#this command reads a line from the source
		#and stores it in $_.  $status is set to 0
		#if there are no more lines, 1 for success
		#or to a negative number for failure 
		my $status = filter_read;

		#If we are in a #DEBUG ON block and the file
		#ends then we have a problem; better to fail
		#than to screw up the script
		croak "unbalanced '#DEBUG'" if $status == 0 and $in_debug;

		#if the line starts with #DEBUG ON then
		#we need to start commenting out lines
		if (/^\s*#DEBUG ON/) {
			#warn the user that nesting #DEBUG ONs 
			#can be dangerous (bad things can happen
			#if you combine "use DEBUG;", "no DEBUG;",
			#and nested #DEBUG ONs).  We increment
			#$in_debug so that we know how deeply we 
			#are nested (there must be a matching 
			#number of #DEBUG OFFs).
			carp "nested #DEBUG ON is dangerous" if ++$in_debug > 1;
		}

		#else if the line contains #DEBUG OFF then we need to stop
		#commenting out lines.  We decrement $in_debug for the
		#same reason we incremented it above.
		elsif (/^\s*#DEBUG OFF/) {
			#if there are more #DEBUG OFFs than #DEBUG ONs
			#then we have a serious problem.
			croak "unbalanced '#DEBUG'" if --$in_debug < 0;
		}

		#else if we are currently in a debug block then prepend
		#a comment character to the line
		elsif ($in_debug) {
			s/^/#/;
		}

		#return the status
		return $status;
	});
}

#the import subroutine gets called when you "use MODULENAME;".
#I am using it here to turn off the filter.
sub import {
	filter_del();
}

#modules must return true.
1;

-- 
Today is Sweetmorn the 43rd day of Discord in the YOLD 3168
Grudnuk demand sustenance!

Missile Address: 33:48:3.521N  84:23:34.786W


Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About