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
Mail::Milter::Wrapper(3pm)				User Contributed Perl Documentation				Mail::Milter::Wrapper(3pm)

NAME
Mail::Milter::Wrapper - Perl extension for wrappering milter objects SYNOPSIS
use Mail::Milter::Wrapper; my $milter = ...; my $wrapper = new Mail::Milter::Wrapper($milter, &foo); use Sendmail::Milter; ... Sendmail::Milter::register('foo', $wrapper, SMFI_CURR_ACTS); DESCRIPTION
Mail::Milter::Wrapper wraps another milter, allowing for interception of the passed arguments and/or return code of the contained milter. METHODS
new(MILTER, CODEREF[, CALLBACK ...]) Creates a Mail::Milter::Wrapper object. MILTER is the milter to wrap, which may be a plain hash reference or an instance of a hashref object such as "Mail::Milter::Object". CODEREF is the wrapper subroutine. CALLBACKs, if specified, are named callbacks which are needed by the wrapper, even if the contained milter does not use them. The wrapper subroutine will be called with the following arguments, in this order: * reference to the wrapper * name of callback * subroutine reference to call into the wrapped milter * arguments for the callback (>= 0) This subroutine should ALWAYS pass the "close" callback through to the contained milter. Failure to do so may corrupt the contained milter's state information and cause memory leaks. As an example, a simple subroutine which just passes the callback through might be written as: sub callback_wrapper { shift; # don't need $this my $cbname = shift; my $callback_sub = shift; &$callback_sub(@_); } AUTHOR
Todd Vierling, <tv@duh.org> <tv@pobox.com> SEE ALSO
Mail::Milter, Sendmail::Milter perl v5.8.8 2004-02-26 Mail::Milter::Wrapper(3pm)
All times are GMT -4. The time now is 04:02 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy