Sponsored Content
Full Discussion: perl function call tracking
Top Forums Shell Programming and Scripting perl function call tracking Post 90639 by cbkihong on Thursday 24th of November 2005 08:49:50 PM
Old 11-24-2005
What do you exactly mean by "the number of times it has been called"? A subroutine may have been called 1000 times, but one after another (not recursive); or it can be like what you have shown, a series of recursive invocations that builds up a call stack.

You can always keep track of the count yourself, but with a global (package) variable (instead of "my"), so that it keeps the value during the recursion. Simple, and it's probably more elegant than another method I can think of, below.

The following only applies to recursive invocations.

Every programming language must internally keep track of the call stack for procedural calls. However, whether that is available to you is another story.

I think you can get this sort of Perl internal information with XS. But that is too hardcore, and I don't know exactly how to do it. So forget it for now.

Probably a more approachable method is to use the caller() function.

This example is inspired by your code:

Code:
#!/usr/bin/perl

sub foo {
	my $num = shift;
	if ($num == 0) {
		DB::printstack();
	} else {
		foo($num - 1);
	}
}

foo(6);

package DB;

sub printstack {
	my $i = 1;
	for (;;) {
		my ($package, $filename, $line, $subroutine) = caller($i);
		last if (!defined(scalar caller($i))); 
		print "Subroutine: $subroutine; Line: $line; Arg: ${DB::args[0]}\n";
		$i++;
	}
}

1;

Code:
Subroutine: main::foo; Line: 8; Arg: 0
Subroutine: main::foo; Line: 8; Arg: 1
Subroutine: main::foo; Line: 8; Arg: 2
Subroutine: main::foo; Line: 8; Arg: 3
Subroutine: main::foo; Line: 8; Arg: 4
Subroutine: main::foo; Line: 8; Arg: 5
Subroutine: main::foo; Line: 12; Arg: 6

So foo(6) will invoke foo(5) all the way until foo(0), so the call stack in this context should have 7 entries. On foo(0), we trigger the printstack() function to print the call stack. We go from the caller for foo(0), i.e. foo(1) all the way back to foo(6) at the file scope. If you want to get a count, you may probably just capture $subroutine for all iterations and look for the number of entries which matches "main::foo".

Is this too verbose for a count? Yes, but this has other uses (e.g. as debugging and trace execution) which can be useful though you did not mention in your question.
 

10 More Discussions You Might Find Interesting

1. Programming

Help with a function call

Hi, Can anyone help me figure out the problem I'm having with a function call? I have a header file, which sets an enum: typedef enum {INFO, WARNING, FATAL} Levels; int log_event (Levels, char *fmt, ...); ..then the function is called this way: log_event(INFO, "Message text"); ... (6 Replies)
Discussion started by: Stevhp
6 Replies

2. Shell Programming and Scripting

call function

I have a function check_ok in my abc.sh. which return me 1 or 0 . I want to call this fuction through other shell script. this shell also send two parameter to calling function. Can you please tell me how. I am very new in unix. #!/bin/bash date_equal() { sqlplus -silent... (4 Replies)
Discussion started by: Jamil Qadir
4 Replies

3. Shell Programming and Scripting

function call

hi, can any one help me to correct this function call. awk -F "," '{ {first=$1; sec=$2; tro=$3;quat=$4 } if (tro == "") { $3 = search "$file2" "$first" "$file3" {print $1","$2","$3","$4} } else {print $1","$2","$3 $4}}' $file1 > $file search () { (2 Replies)
Discussion started by: kamel.seg
2 Replies

4. Shell Programming and Scripting

help on function call

hello, when i call function inside awk traitement it doesn't work, i don't have error execution but i don't get result and if i call the function outside awk traitement it work well.. there's something special in awk call function?? here is the example : awk -F "," '{ {first=$1; sec=$2;... (3 Replies)
Discussion started by: kamel.seg
3 Replies

5. Shell Programming and Scripting

Function Call

How we can start a process if doesn't exists before? (1 Reply)
Discussion started by: Zaxon
1 Replies

6. Shell Programming and Scripting

Function Call

Hi, I have a string corresponding to a function. How I can call that function without if statement? Thanks in advance. (4 Replies)
Discussion started by: Zaxon
4 Replies

7. Infrastructure Monitoring

diffrence between method call and function call in perl

Hello, I have a problem with package and name space. require "/Mehran/DSGateEngineLib/general.pl"; use strict; sub System_Status_Main_Service_Status_Intrusion_Prevention { my %idpstatus; my @result; &General_ReadHash("/var/dsg/idp/settings",\%idpstatus); #print... (4 Replies)
Discussion started by: Zaxon
4 Replies

8. Shell Programming and Scripting

Function call

Hi foiks i am unable to find what is wrong in my code mu functionality is to exit from shell when i give 99 but it is not calling function ext Could you please correct me. read option if ; then ext else echo "out" fi function ext { echo "tested 99 and exit... (12 Replies)
Discussion started by: kojo
12 Replies

9. Shell Programming and Scripting

After exit from function it should not call other function

Below is my script that is function properly per my conditions but I am facing one problem here that is when one function fails then Iy should not check other functions but it calls the other function too So anyone can help me how could i achieve this? iNOUT i AM GIVING TO THE... (1 Reply)
Discussion started by: rohit22hamirpur
1 Replies

10. Shell Programming and Scripting

How to Call a Function

Hi I have created a function in a Shell Script test.sh function fnTest() { echo "My first Method } I have called this function in my test.sh cat abc.txt | grep "test" echo " test" fnTest But while running the shell script i got the following error: ... (2 Replies)
Discussion started by: nanthagopal
2 Replies
XML::Parser::LiteCopy(3pm)				User Contributed Perl Documentation				XML::Parser::LiteCopy(3pm)

NAME
XML::Parser::LiteCopy - Lightweight regexp-based XML parser SYNOPSIS
use XML::Parser::LiteCopy; $p1 = new XML::Parser::LiteCopy; $p1->setHandlers( Start => sub { shift; print "start: @_ " }, Char => sub { shift; print "char: @_ " }, End => sub { shift; print "end: @_ " }, ); $p1->parse('<foo id="me">Hello World!</foo>'); $p2 = new XML::Parser::LiteCopy Handlers => { Start => sub { shift; print "start: @_ " }, Char => sub { shift; print "char: @_ " }, End => sub { shift; print "end: @_ " }, } ; $p2->parse('<foo id="me">Hello <bar>cruel</bar> World!</foo>'); DESCRIPTION
This Perl implements an XML parser with a interface similar to XML::Parser. Though not all callbacks are supported, you should be able to use it in the same way you use XML::Parser. Due to using experimantal regexp features it'll work only on Perl 5.6 and above and may behave differently on different platforms. Note that you cannot use regular expressions or split in callbacks. This is due to a limitation of perl's regular expression implementation (which is not re-entrant). SUBROUTINES
/METHODS new Constructor. As (almost) all SOAP::Lite constructors, new() returns the object called on when called as object method. This means that the following effectifely is a no-op if $obj is a object: $obj = $obj->new(); New accepts a single named parameter, "Handlers" with a hash ref as value: my $parser = XML::Parser::Lite->new( Handlers => { Start => sub { shift; print "start: @_ " }, Char => sub { shift; print "char: @_ " }, End => sub { shift; print "end: @_ " }, } ); The handlers given will be passed to setHandlers. setHandlers Sets (or resets) the parsing handlers. Accepts a hash with the handler names and handler code references as parameters. Passing "undef" instead of a code reference replaces the handler by a no-op. The following handlers can be set: Init Start Char End Final CData Doctype Comment PI All other handlers are ignored. Calling setHandlers without parameters resets all handlers to no-ops. parse Parses the XML given. In contrast to XML::Parser's parse method, parse() only parses strings. Handler methods Init Called before parsing starts. You should perform any necessary initializations in Init. Start Called at the start of each XML node. See XML::Parser for details. Char Called for each character sequence. May be called multiple times for the characters contained in an XML node (even for every single character). Your implementation has to make sure that it captures all characters. End Called at the end of each XML node. See XML::Parser for details Comment See XML::Parser for details PI See XMLDecl in XML::Parser for details, but also includes other processing instructions Doctype See XML::Parser for details Final Called at the end of the parsing process. You should perform any necessary cleanup here. SEE ALSO
XML::Parser COPYRIGHT
Copyright (C) 2000-2007 Paul Kulchenko. All rights reserved. Copyright (C) 2008 Martin Kutter. All rights reserved. Copyright (C) 2009 Cal Henderson. All rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. This parser is based on "shallow parser" http://www.cs.sfu.ca/~cameron/REX.html Copyright (c) 1998, Robert D. Cameron. AUTHOR
Paul Kulchenko (paulclinger@yahoo.com) Martin Kutter (martin.kutter@fen-net.de) Additional handlers supplied by Adam Leggett. Further modifications by Cal Henderson. perl v5.12.3 2011-06-05 XML::Parser::LiteCopy(3pm)
All times are GMT -4. The time now is 08:55 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy