Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Parsing Class Paths

by LunaticLeo (Scribe)
on Apr 01, 2000 at 04:31 UTC ( #6638=perlcraft: print w/ replies, xml ) Need Help??

   1: $caller = "My::Class::Path::myfunc";
   2: 
   3: # Fastest method
   4: # regex-with-prematch
   5: my ($func) = $caller =~ /::([^:]*)$/;
   6: my $class = $`; # aka. $PREMATCH
   7: 
   8: # Second place; only .09sec in 100,000 iterations slower
   9: # split-pop-join
  10: my (@objpath) = split(/::/, $caller);
  11: my ($func)  = pop @objpath;
  12: my ($class) = join('::', @objpath);
  13: 
  14: # Third place; 25% slower
  15: # globalrx-pop-join
  16: my (@objpath) = $caller =~ /([^:]+)/g;
  17: my ($func)  = pop @objpath;
  18: my ($class) = join('::', @objpath);

Comment on Parsing Class Paths
Download Code
RE: Parsing Class Paths
by japhy (Canon) on Apr 07, 2000 at 16:47 UTC
    You slow your program down by using $`. Why do this, when you can simply say (and these tests ALL ASSUME that you are given a FULLY QUALIFIED name, meaning there is at least one :: in it):
    ($package,$symbol) = $qualified_name =~ /(.*)::(.*)/;
    I came up with another method, too, using rindex() and unpack(). I benchmarked yours and mine in separate processes so mine wouldn't be jinxed by yours using $`.
    RESULTS: $qualified_name = 'My::Class::Path::func' Benchmark: timing 100000 iterations of Lunatic... Lunatic: 15 wallclock secs (13.99 usr + 0.00 sys = 13.99 CPU) $qualified_name = 'My::Class::Path::myfunc' Benchmark: timing 100000 iterations of Jeff1, Jeff2... Jeff1: 8 wallclock secs ( 8.95 usr + 0.00 sys = 8.95 CPU) Jeff2: 9 wallclock secs ( 8.82 usr + 0.00 sys = 8.82 CPU)
    I'll include my code below in a moment. I also tried these on longer qualfied names, SPECIFICALLY one with a longer symbol name. Note: disregard the "wallclock secs" times; they're obviously munged up.
    $qualified_name = 'My::Class::Path::myfuncdamnthisisareallylongstring' Benchmark: timing 100000 iterations of Jeff1, Jeff2... Jeff1: 12 wallclock secs (12.54 usr + 0.00 sys = 12.54 CPU) Jeff2: 10 wallclock secs ( 9.55 usr + 0.00 sys = 9.55 CPU) $qualified_name = 'My::REALLYLONGClass::PathPathPath::myfuncdamnthisis +areallylongstring' Benchmark: timing 100000 iterations of Jeff1, Jeff2... Jeff1: 12 wallclock secs (12.73 usr + 0.00 sys = 12.73 CPU) Jeff2: 8 wallclock secs ( 9.14 usr + 0.00 sys = 9.14 CPU) $qualified_name = 'My::REALLYLONGClass::PathPathPath::myfunc' Benchmark: timing 100000 iterations of Jeff1, Jeff2... Jeff1: 11 wallclock secs ( 9.12 usr + 0.00 sys = 9.12 CPU) Jeff2: 8 wallclock secs ( 8.78 usr + 0.00 sys = 8.78 CPU)
    And there you have it. It seems my rindex() and unpack() method outruns the regex approach every time. Here it is, for your amusement and edification:
    my ($pkg,$sym) = unpack "A" . rindex($qualified_name, "::") . " x2 A*", $qualified_name;

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlcraft [id://6638]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (9)
As of 2014-07-10 17:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (214 votes), past polls