Filename | /usr/lib64/perl5/5.16.0/FindBin.pm |
Statements | Executed 38 statements in 6.01ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 18.5ms | 79.9ms | BEGIN@83 | FindBin::
1 | 1 | 1 | 10.9ms | 11.9ms | BEGIN@85 | FindBin::
1 | 1 | 1 | 7.79ms | 9.02ms | BEGIN@84 | FindBin::
1 | 1 | 1 | 339µs | 1.28ms | init | FindBin::
1 | 1 | 1 | 81µs | 331µs | BEGIN@80 | FindBin::
1 | 1 | 1 | 70µs | 93µs | cwd2 | FindBin::
1 | 1 | 1 | 46µs | 1.33ms | BEGIN@166 | FindBin::
1 | 1 | 1 | 26µs | 26µs | CORE:ftfile (opcode) | FindBin::
1 | 1 | 1 | 26µs | 26µs | CORE:readlink (opcode) | FindBin::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | # FindBin.pm | ||||
2 | # | ||||
3 | # Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved. | ||||
4 | # This program is free software; you can redistribute it and/or modify it | ||||
5 | # under the same terms as Perl itself. | ||||
6 | |||||
7 | =head1 NAME | ||||
8 | |||||
9 | FindBin - Locate directory of original perl script | ||||
10 | |||||
11 | =head1 SYNOPSIS | ||||
12 | |||||
13 | use FindBin; | ||||
14 | use lib "$FindBin::Bin/../lib"; | ||||
15 | |||||
16 | or | ||||
17 | |||||
18 | use FindBin qw($Bin); | ||||
19 | use lib "$Bin/../lib"; | ||||
20 | |||||
21 | =head1 DESCRIPTION | ||||
22 | |||||
23 | Locates the full path to the script bin directory to allow the use | ||||
24 | of paths relative to the bin directory. | ||||
25 | |||||
26 | This allows a user to setup a directory tree for some software with | ||||
27 | directories C<< <root>/bin >> and C<< <root>/lib >>, and then the above | ||||
28 | example will allow the use of modules in the lib directory without knowing | ||||
29 | where the software tree is installed. | ||||
30 | |||||
31 | If perl is invoked using the B<-e> option or the perl script is read from | ||||
32 | C<STDIN> then FindBin sets both C<$Bin> and C<$RealBin> to the current | ||||
33 | directory. | ||||
34 | |||||
35 | =head1 EXPORTABLE VARIABLES | ||||
36 | |||||
37 | $Bin - path to bin directory from where script was invoked | ||||
38 | $Script - basename of script from which perl was invoked | ||||
39 | $RealBin - $Bin with all links resolved | ||||
40 | $RealScript - $Script with all links resolved | ||||
41 | |||||
42 | =head1 KNOWN ISSUES | ||||
43 | |||||
44 | If there are two modules using C<FindBin> from different directories | ||||
45 | under the same interpreter, this won't work. Since C<FindBin> uses a | ||||
46 | C<BEGIN> block, it'll be executed only once, and only the first caller | ||||
47 | will get it right. This is a problem under mod_perl and other persistent | ||||
48 | Perl environments, where you shouldn't use this module. Which also means | ||||
49 | that you should avoid using C<FindBin> in modules that you plan to put | ||||
50 | on CPAN. To make sure that C<FindBin> will work is to call the C<again> | ||||
51 | function: | ||||
52 | |||||
53 | use FindBin; | ||||
54 | FindBin::again(); # or FindBin->again; | ||||
55 | |||||
56 | In former versions of FindBin there was no C<again> function. The | ||||
57 | workaround was to force the C<BEGIN> block to be executed again: | ||||
58 | |||||
59 | delete $INC{'FindBin.pm'}; | ||||
60 | require FindBin; | ||||
61 | |||||
62 | =head1 AUTHORS | ||||
63 | |||||
64 | FindBin is supported as part of the core perl distribution. Please send bug | ||||
65 | reports to E<lt>F<perlbug@perl.org>E<gt> using the perlbug program | ||||
66 | included with perl. | ||||
67 | |||||
68 | Graham Barr E<lt>F<gbarr@pobox.com>E<gt> | ||||
69 | Nick Ing-Simmons E<lt>F<nik@tiuk.ti.com>E<gt> | ||||
70 | |||||
71 | =head1 COPYRIGHT | ||||
72 | |||||
73 | Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved. | ||||
74 | This program is free software; you can redistribute it and/or modify it | ||||
75 | under the same terms as Perl itself. | ||||
76 | |||||
77 | =cut | ||||
78 | |||||
79 | package FindBin; | ||||
80 | 2 | 269µs | 2 | 582µs | # spent 331µs (81+250) within FindBin::BEGIN@80 which was called:
# once (81µs+250µs) by main::BEGIN@16 at line 80 # spent 331µs making 1 call to FindBin::BEGIN@80
# spent 250µs making 1 call to Exporter::import |
81 | 1 | 68µs | require 5.000; | ||
82 | 1 | 3µs | require Exporter; | ||
83 | 2 | 895µs | 2 | 80.3ms | # spent 79.9ms (18.5+61.4) within FindBin::BEGIN@83 which was called:
# once (18.5ms+61.4ms) by main::BEGIN@16 at line 83 # spent 79.9ms making 1 call to FindBin::BEGIN@83
# spent 459µs making 1 call to Exporter::import |
84 | 2 | 1.03ms | 2 | 9.29ms | # spent 9.02ms (7.79+1.23) within FindBin::BEGIN@84 which was called:
# once (7.79ms+1.23ms) by main::BEGIN@16 at line 84 # spent 9.02ms making 1 call to FindBin::BEGIN@84
# spent 271µs making 1 call to Exporter::import |
85 | 2 | 2.87ms | 1 | 11.9ms | # spent 11.9ms (10.9+976µs) within FindBin::BEGIN@85 which was called:
# once (10.9ms+976µs) by main::BEGIN@16 at line 85 # spent 11.9ms making 1 call to FindBin::BEGIN@85 |
86 | |||||
87 | 1 | 12µs | @EXPORT_OK = qw($Bin $Script $RealBin $RealScript $Dir $RealDir); | ||
88 | 1 | 15µs | %EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]); | ||
89 | 1 | 31µs | @ISA = qw(Exporter); | ||
90 | |||||
91 | 1 | 3µs | $VERSION = "1.51"; | ||
92 | |||||
93 | |||||
94 | # needed for VMS-specific filename translation | ||||
95 | 1 | 5µs | if( $^O eq 'VMS' ) { | ||
96 | require VMS::Filespec; | ||||
97 | VMS::Filespec->import; | ||||
98 | } | ||||
99 | |||||
100 | # spent 93µs (70+23) within FindBin::cwd2 which was called:
# once (70µs+23µs) by FindBin::init at line 137 | ||||
101 | 1 | 81µs | 1 | 23µs | my $cwd = getcwd(); # spent 23µs making 1 call to Cwd::getcwd |
102 | # getcwd might fail if it hasn't access to the current directory. | ||||
103 | # try harder. | ||||
104 | 1 | 2µs | defined $cwd or $cwd = cwd(); | ||
105 | 1 | 31µs | $cwd; | ||
106 | } | ||||
107 | |||||
108 | sub init | ||||
109 | # spent 1.28ms (339µs+944µs) within FindBin::init which was called:
# once (339µs+944µs) by FindBin::BEGIN@166 at line 166 | ||||
110 | 1 | 6µs | *Dir = \$Bin; | ||
111 | 1 | 2µs | *RealDir = \$RealBin; | ||
112 | |||||
113 | 1 | 28µs | if($0 eq '-e' || $0 eq '-') | ||
114 | { | ||||
115 | # perl invoked with -e or script is on C<STDIN> | ||||
116 | $Script = $RealScript = $0; | ||||
117 | $Bin = $RealBin = cwd2(); | ||||
118 | $Bin = VMS::Filespec::unixify($Bin) if $^O eq 'VMS'; | ||||
119 | } | ||||
120 | else | ||||
121 | { | ||||
122 | 1 | 6µs | my $script = $0; | ||
123 | |||||
124 | 1 | 6µs | if ($^O eq 'VMS') | ||
125 | { | ||||
126 | ($Bin,$Script) = VMS::Filespec::rmsexpand($0) =~ /(.*[\]>\/]+)(.*)/s; | ||||
127 | # C<use disk:[dev]/lib> isn't going to work, so unixify first | ||||
128 | ($Bin = VMS::Filespec::unixify($Bin)) =~ s/\/\z//; | ||||
129 | ($RealBin,$RealScript) = ($Bin,$Script); | ||||
130 | } | ||||
131 | else | ||||
132 | { | ||||
133 | 1 | 63µs | 1 | 26µs | croak("Cannot find current script '$0'") unless(-f $script); # spent 26µs making 1 call to FindBin::CORE:ftfile |
134 | |||||
135 | # Ensure $script contains the complete path in case we C<chdir> | ||||
136 | |||||
137 | 1 | 71µs | 3 | 605µs | $script = File::Spec->catfile(cwd2(), $script) # spent 442µs making 1 call to File::Spec::Unix::catfile
# spent 93µs making 1 call to FindBin::cwd2
# spent 70µs making 1 call to File::Spec::Unix::file_name_is_absolute |
138 | unless File::Spec->file_name_is_absolute($script); | ||||
139 | |||||
140 | 1 | 18µs | 1 | 115µs | ($Script,$Bin) = fileparse($script); # spent 115µs making 1 call to File::Basename::fileparse |
141 | |||||
142 | # Resolve $script if it is a link | ||||
143 | 1 | 2µs | while(1) | ||
144 | { | ||||
145 | 1 | 53µs | 1 | 26µs | my $linktext = readlink($script); # spent 26µs making 1 call to FindBin::CORE:readlink |
146 | |||||
147 | 1 | 16µs | 1 | 77µs | ($RealScript,$RealBin) = fileparse($script); # spent 77µs making 1 call to File::Basename::fileparse |
148 | 1 | 4µs | last unless defined $linktext; | ||
149 | |||||
150 | $script = (File::Spec->file_name_is_absolute($linktext)) | ||||
151 | ? $linktext | ||||
152 | : File::Spec->catfile($RealBin, $linktext); | ||||
153 | } | ||||
154 | |||||
155 | # Get absolute paths to directories | ||||
156 | 1 | 2µs | if ($Bin) { | ||
157 | 1 | 3µs | my $BinOld = $Bin; | ||
158 | 1 | 83µs | 1 | 56µs | $Bin = abs_path($Bin); # spent 56µs making 1 call to Cwd::abs_path |
159 | 1 | 2µs | defined $Bin or $Bin = File::Spec->canonpath($BinOld); | ||
160 | } | ||||
161 | 1 | 60µs | 1 | 40µs | $RealBin = abs_path($RealBin) if($RealBin); # spent 40µs making 1 call to Cwd::abs_path |
162 | } | ||||
163 | } | ||||
164 | } | ||||
165 | |||||
166 | 1 | 232µs | 2 | 2.61ms | # spent 1.33ms (46µs+1.28) within FindBin::BEGIN@166 which was called:
# once (46µs+1.28ms) by main::BEGIN@16 at line 166 # spent 1.33ms making 1 call to FindBin::BEGIN@166
# spent 1.28ms making 1 call to FindBin::init |
167 | |||||
168 | 1 | 9µs | *again = \&init; | ||
169 | |||||
170 | 1 | 38µs | 1; # Keep require happy | ||
# spent 26µs within FindBin::CORE:ftfile which was called:
# once (26µs+0s) by FindBin::init at line 133 | |||||
# spent 26µs within FindBin::CORE:readlink which was called:
# once (26µs+0s) by FindBin::init at line 145 |