http://www.perlmonks.org?node_id=6638

   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);

Replies are listed 'Best First'.
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;