Filename | /usr/share/perl/5.10/Text/Abbrev.pm |
Statements | Executed 195 statements in 430µs |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
3 | 1 | 1 | 364µs | 364µs | abbrev | Text::Abbrev::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Text::Abbrev; | ||||
2 | 1 | 34µs | require 5.005; # Probably works on earlier versions too. | ||
3 | 1 | 1µs | require Exporter; | ||
4 | |||||
5 | 1 | 700ns | our $VERSION = '1.01'; | ||
6 | |||||
7 | =head1 NAME | ||||
8 | |||||
- - | |||||
35 | 1 | 13µs | @ISA = qw(Exporter); | ||
36 | 1 | 600ns | @EXPORT = qw(abbrev); | ||
37 | |||||
38 | # Usage: | ||||
39 | # abbrev \%foo, LIST; | ||||
40 | # ... | ||||
41 | # $long = $foo{$short}; | ||||
42 | |||||
43 | # spent 364µs within Text::Abbrev::abbrev which was called 3 times, avg 121µs/call:
# 3 times (364µs+0s) by CGI::Session::parse_dsn at line 152 of CGI/Session.pm, avg 121µs/call | ||||
44 | 189 | 375µs | my ($word, $hashref, $glob, %table, $returnvoid); | ||
45 | |||||
46 | @_ or return; # So we don't autovivify onto @_ and trigger warning | ||||
47 | if (ref($_[0])) { # hash reference preferably | ||||
48 | $hashref = shift; | ||||
49 | $returnvoid = 1; | ||||
50 | } elsif (ref \$_[0] eq 'GLOB') { # is actually a glob (deprecated) | ||||
51 | $hashref = \%{shift()}; | ||||
52 | $returnvoid = 1; | ||||
53 | } | ||||
54 | %{$hashref} = (); | ||||
55 | |||||
56 | WORD: foreach $word (@_) { | ||||
57 | for (my $len = (length $word) - 1; $len > 0; --$len) { | ||||
58 | my $abbrev = substr($word,0,$len); | ||||
59 | my $seen = ++$table{$abbrev}; | ||||
60 | if ($seen == 1) { # We're the first word so far to have | ||||
61 | # this abbreviation. | ||||
62 | $hashref->{$abbrev} = $word; | ||||
63 | } elsif ($seen == 2) { # We're the second word to have this | ||||
64 | # abbreviation, so we can't use it. | ||||
65 | delete $hashref->{$abbrev}; | ||||
66 | } else { # We're the third word to have this | ||||
67 | # abbreviation, so skip to the next word. | ||||
68 | next WORD; | ||||
69 | } | ||||
70 | } | ||||
71 | } | ||||
72 | # Non-abbreviations always get entered, even if they aren't unique | ||||
73 | foreach $word (@_) { | ||||
74 | $hashref->{$word} = $word; | ||||
75 | } | ||||
76 | return if $returnvoid; | ||||
77 | if (wantarray) { | ||||
78 | %{$hashref}; | ||||
79 | } else { | ||||
80 | $hashref; | ||||
81 | } | ||||
82 | } | ||||
83 | |||||
84 | 1 | 6µs | 1; |