perl function call tracking


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting perl function call tracking
# 1  
Old 11-24-2005
perl function call tracking

Assuming the following code

sub foo {
dosomething {...}
else { foo }

is the number of times foo has been called kept track of internally and how could I access that count?
# 2  
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.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. 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

2. 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

3. 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

4. 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

5. 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

6. 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

7. 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

8. 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

9. 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

10. 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
Login or Register to Ask a Question