Filename | /usr/share/perl5/Path/Class/File.pm |
Statements | Executed 65 statements in 1.30ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 1.94ms | 2.02ms | BEGIN@14 | Path::Class::File::
1 | 1 | 1 | 1.79ms | 28.7ms | BEGIN@8 | Path::Class::File::
1 | 1 | 1 | 286µs | 318µs | BEGIN@13 | Path::Class::File::
2 | 2 | 2 | 48µs | 252µs | new | Path::Class::File::
1 | 1 | 1 | 34µs | 297µs | spew | Path::Class::File::
4 | 1 | 1 | 30µs | 214µs | stringify | Path::Class::File::
1 | 1 | 1 | 19µs | 169µs | slurp | Path::Class::File::
2 | 2 | 1 | 8µs | 404µs | open | Path::Class::File::
1 | 1 | 1 | 8µs | 17µs | BEGIN@1 | Path::Class::
1 | 1 | 1 | 7µs | 68µs | BEGIN@10 | Path::Class::File::
1 | 1 | 1 | 6µs | 32µs | BEGIN@9 | Path::Class::File::
1 | 1 | 1 | 6µs | 6µs | CORE:readline (opcode) | Path::Class::File::
1 | 1 | 1 | 4µs | 4µs | BEGIN@55 | Path::Class::File::
1 | 1 | 1 | 4µs | 4µs | BEGIN@12 | Path::Class::File::
1 | 1 | 1 | 3µs | 3µs | CORE:print (opcode) | Path::Class::File::
2 | 1 | 1 | 2µs | 2µs | dir_class | Path::Class::File::
0 | 0 | 0 | 0s | 0s | __ANON__[:189] | Path::Class::File::
0 | 0 | 0 | 0s | 0s | __ANON__[:195] | Path::Class::File::
0 | 0 | 0 | 0s | 0s | as_foreign | Path::Class::File::
0 | 0 | 0 | 0s | 0s | basename | Path::Class::File::
0 | 0 | 0 | 0s | 0s | components | Path::Class::File::
0 | 0 | 0 | 0s | 0s | copy_to | Path::Class::File::
0 | 0 | 0 | 0s | 0s | dir | Path::Class::File::
0 | 0 | 0 | 0s | 0s | move_to | Path::Class::File::
0 | 0 | 0 | 0s | 0s | opena | Path::Class::File::
0 | 0 | 0 | 0s | 0s | openr | Path::Class::File::
0 | 0 | 0 | 0s | 0s | openw | Path::Class::File::
0 | 0 | 0 | 0s | 0s | remove | Path::Class::File::
0 | 0 | 0 | 0s | 0s | touch | Path::Class::File::
0 | 0 | 0 | 0s | 0s | traverse | Path::Class::File::
0 | 0 | 0 | 0s | 0s | traverse_if | Path::Class::File::
0 | 0 | 0 | 0s | 0s | volume | Path::Class::File::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | 2 | 38µs | 2 | 27µs | # spent 17µs (8+10) within Path::Class::BEGIN@1 which was called:
# once (8µs+10µs) by Path::Class::BEGIN@17 at line 1 # spent 17µs making 1 call to Path::Class::BEGIN@1
# spent 10µs making 1 call to strict::import |
2 | |||||
3 | package Path::Class::File; | ||||
4 | { | ||||
5 | 2 | 900ns | $Path::Class::File::VERSION = '0.33'; | ||
6 | } | ||||
7 | |||||
8 | 2 | 71µs | 1 | 28.7ms | # spent 28.7ms (1.79+26.9) within Path::Class::File::BEGIN@8 which was called:
# once (1.79ms+26.9ms) by Path::Class::BEGIN@17 at line 8 # spent 28.7ms making 1 call to Path::Class::File::BEGIN@8 |
9 | 2 | 22µs | 2 | 58µs | # spent 32µs (6+26) within Path::Class::File::BEGIN@9 which was called:
# once (6µs+26µs) by Path::Class::BEGIN@17 at line 9 # spent 32µs making 1 call to Path::Class::File::BEGIN@9
# spent 26µs making 1 call to parent::import |
10 | 2 | 32µs | 2 | 129µs | # spent 68µs (7+61) within Path::Class::File::BEGIN@10 which was called:
# once (7µs+61µs) by Path::Class::BEGIN@17 at line 10 # spent 68µs making 1 call to Path::Class::File::BEGIN@10
# spent 61µs making 1 call to Exporter::import |
11 | |||||
12 | 2 | 16µs | 1 | 4µs | # spent 4µs within Path::Class::File::BEGIN@12 which was called:
# once (4µs+0s) by Path::Class::BEGIN@17 at line 12 # spent 4µs making 1 call to Path::Class::File::BEGIN@12 |
13 | 2 | 78µs | 1 | 318µs | # spent 318µs (286+33) within Path::Class::File::BEGIN@13 which was called:
# once (286µs+33µs) by Path::Class::BEGIN@17 at line 13 # spent 318µs making 1 call to Path::Class::File::BEGIN@13 |
14 | 2 | 259µs | 1 | 2.02ms | # spent 2.02ms (1.94+82µs) within Path::Class::File::BEGIN@14 which was called:
# once (1.94ms+82µs) by Path::Class::BEGIN@17 at line 14 # spent 2.02ms making 1 call to Path::Class::File::BEGIN@14 |
15 | |||||
16 | # spent 252µs (48+203) within Path::Class::File::new which was called 2 times, avg 126µs/call:
# once (36µs+152µs) by Path::Class::file at line 21 of Path/Class.pm
# once (12µs+51µs) by Path::Class::Dir::file at line 89 of Path/Class/Dir.pm | ||||
17 | 2 | 6µs | 2 | 7µs | my $self = shift->SUPER::new; # spent 7µs making 2 calls to Path::Class::Entity::new, avg 3µs/call |
18 | 2 | 800ns | my $file = pop(); | ||
19 | 2 | 1µs | my @dirs = @_; | ||
20 | |||||
21 | 2 | 7µs | 4 | 63µs | my ($volume, $dirs, $base) = $self->_spec->splitpath($file); # spent 44µs making 2 calls to Path::Class::Entity::_spec, avg 22µs/call
# spent 19µs making 2 calls to File::Spec::Unix::splitpath, avg 9µs/call |
22 | |||||
23 | 2 | 3µs | 2 | 4µs | if (length $dirs) { # spent 2µs making 1 call to File::Spec::Unix::catpath
# spent 2µs making 1 call to Path::Class::Entity::_spec |
24 | push @dirs, $self->_spec->catpath($volume, $dirs, ''); | ||||
25 | } | ||||
26 | |||||
27 | 2 | 8µs | 4 | 130µs | $self->{dir} = @dirs ? $self->dir_class->new(@dirs) : undef; # spent 128µs making 2 calls to Path::Class::Dir::new, avg 64µs/call
# spent 2µs making 2 calls to Path::Class::File::dir_class, avg 1µs/call |
28 | 2 | 1µs | $self->{file} = $base; | ||
29 | |||||
30 | 2 | 6µs | return $self; | ||
31 | } | ||||
32 | |||||
33 | 2 | 4µs | # spent 2µs within Path::Class::File::dir_class which was called 2 times, avg 1µs/call:
# 2 times (2µs+0s) by Path::Class::File::new at line 27, avg 1µs/call | ||
34 | |||||
35 | sub as_foreign { | ||||
36 | my ($self, $type) = @_; | ||||
37 | local $Path::Class::Foreign = $self->_spec_class($type); | ||||
38 | my $foreign = ref($self)->SUPER::new; | ||||
39 | $foreign->{dir} = $self->{dir}->as_foreign($type) if defined $self->{dir}; | ||||
40 | $foreign->{file} = $self->{file}; | ||||
41 | return $foreign; | ||||
42 | } | ||||
43 | |||||
44 | # spent 214µs (30+184) within Path::Class::File::stringify which was called 4 times, avg 54µs/call:
# 4 times (30µs+184µs) by IO::File::CORE:open at line 62 of IO/File.pm, avg 54µs/call | ||||
45 | 4 | 1µs | my $self = shift; | ||
46 | 4 | 2µs | return $self->{file} unless defined $self->{dir}; | ||
47 | 4 | 20µs | 12 | 184µs | return $self->_spec->catfile($self->{dir}->stringify, $self->{file}); # spent 94µs making 4 calls to File::Spec::Unix::catfile, avg 23µs/call
# spent 84µs making 4 calls to Path::Class::Dir::stringify, avg 21µs/call
# spent 6µs making 4 calls to Path::Class::Entity::_spec, avg 1µs/call |
48 | } | ||||
49 | |||||
50 | sub dir { | ||||
51 | my $self = shift; | ||||
52 | return $self->{dir} if defined $self->{dir}; | ||||
53 | return $self->dir_class->new($self->_spec->curdir); | ||||
54 | } | ||||
55 | 1 | 649µs | 1 | 4µs | # spent 4µs within Path::Class::File::BEGIN@55 which was called:
# once (4µs+0s) by Path::Class::BEGIN@17 at line 55 # spent 4µs making 1 call to Path::Class::File::BEGIN@55 |
56 | |||||
57 | sub volume { | ||||
58 | my $self = shift; | ||||
59 | return '' unless defined $self->{dir}; | ||||
60 | return $self->{dir}->volume; | ||||
61 | } | ||||
62 | |||||
63 | sub components { | ||||
64 | my $self = shift; | ||||
65 | die "Arguments are not currently supported by File->components()" if @_; | ||||
66 | return ($self->dir->components, $self->basename); | ||||
67 | } | ||||
68 | |||||
69 | sub basename { shift->{file} } | ||||
70 | 2 | 9µs | 2 | 395µs | sub open { IO::File->new(@_) } # spent 395µs making 2 calls to IO::File::new, avg 198µs/call |
71 | |||||
72 | sub openr { $_[0]->open('r') or croak "Can't read $_[0]: $!" } | ||||
73 | sub openw { $_[0]->open('w') or croak "Can't write to $_[0]: $!" } | ||||
74 | sub opena { $_[0]->open('a') or croak "Can't append to $_[0]: $!" } | ||||
75 | |||||
76 | sub touch { | ||||
77 | my $self = shift; | ||||
78 | if (-e $self) { | ||||
79 | utime undef, undef, $self; | ||||
80 | } else { | ||||
81 | $self->openw; | ||||
82 | } | ||||
83 | } | ||||
84 | |||||
85 | # spent 169µs (19+150) within Path::Class::File::slurp which was called:
# once (19µs+150µs) by PONAPI::Server::ConfigReader::_build_conf at line 33 of lib/PONAPI/Server/ConfigReader.pm | ||||
86 | 1 | 1µs | my ($self, %args) = @_; | ||
87 | 1 | 800ns | my $iomode = $args{iomode} || 'r'; | ||
88 | 1 | 1µs | 1 | 144µs | my $fh = $self->open($iomode) or croak "Can't read $self: $!"; # spent 144µs making 1 call to Path::Class::File::open |
89 | |||||
90 | 1 | 300ns | if (wantarray) { | ||
91 | my @data = <$fh>; | ||||
92 | chomp @data if $args{chomped} or $args{chomp}; | ||||
93 | |||||
94 | if ( my $splitter = $args{split} ) { | ||||
95 | @data = map { [ split $splitter, $_ ] } @data; | ||||
96 | } | ||||
97 | |||||
98 | return @data; | ||||
99 | } | ||||
100 | |||||
101 | |||||
102 | 1 | 1µs | croak "'split' argument can only be used in list context" | ||
103 | if $args{split}; | ||||
104 | |||||
105 | |||||
106 | 1 | 700ns | if ($args{chomped} or $args{chomp}) { | ||
107 | chomp( my @data = <$fh> ); | ||||
108 | return join '', @data; | ||||
109 | } | ||||
110 | |||||
111 | |||||
112 | 1 | 2µs | local $/; | ||
113 | 1 | 19µs | 1 | 6µs | return <$fh>; # spent 6µs making 1 call to Path::Class::File::CORE:readline |
114 | } | ||||
115 | |||||
116 | # spent 297µs (34+264) within Path::Class::File::spew which was called:
# once (34µs+264µs) by PONAPI::CLI::RunServer::_create_dir at line 35 of lib/PONAPI/CLI/RunServer.pm | ||||
117 | 1 | 400ns | my $self = shift; | ||
118 | 1 | 2µs | my %args = splice( @_, 0, @_-1 ); | ||
119 | |||||
120 | 1 | 700ns | my $iomode = $args{iomode} || 'w'; | ||
121 | 1 | 2µs | 1 | 260µs | my $fh = $self->open( $iomode ) or croak "Can't write to $self: $!"; # spent 260µs making 1 call to Path::Class::File::open |
122 | |||||
123 | 1 | 900ns | if (ref($_[0]) eq 'ARRAY') { | ||
124 | # Use old-school for loop to avoid copying. | ||||
125 | for (my $i = 0; $i < @{ $_[0] }; $i++) { | ||||
126 | print $fh $_[0]->[$i]; | ||||
127 | } | ||||
128 | } | ||||
129 | else { | ||||
130 | 1 | 7µs | 1 | 3µs | print $fh $_[0]; # spent 3µs making 1 call to Path::Class::File::CORE:print |
131 | } | ||||
132 | |||||
133 | 1 | 25µs | return; | ||
134 | } | ||||
135 | |||||
136 | sub remove { | ||||
137 | my $file = shift->stringify; | ||||
138 | return unlink $file unless -e $file; # Sets $! correctly | ||||
139 | 1 while unlink $file; | ||||
140 | return not -e $file; | ||||
141 | } | ||||
142 | |||||
143 | sub copy_to { | ||||
144 | my ($self, $dest) = @_; | ||||
145 | if ( UNIVERSAL::isa($dest, Path::Class::File::) ) { | ||||
146 | $dest = $dest->stringify; | ||||
147 | die "Can't copy to file $dest: it is a directory" if -d $dest; | ||||
148 | } elsif ( UNIVERSAL::isa($dest, Path::Class::Dir::) ) { | ||||
149 | $dest = $dest->stringify; | ||||
150 | die "Can't copy to directory $dest: it is a file" if -f $dest; | ||||
151 | die "Can't copy to directory $dest: no such directory" unless -d $dest; | ||||
152 | } elsif ( ref $dest ) { | ||||
153 | die "Don't know how to copy files to objects of type '".ref($self)."'"; | ||||
154 | } | ||||
155 | |||||
156 | if ( !Perl::OSType::is_os_type('Unix') ) { | ||||
157 | |||||
158 | return unless File::Copy::cp($self->stringify, $dest); | ||||
159 | |||||
160 | } else { | ||||
161 | |||||
162 | return unless (system('cp', $self->stringify, $dest) == 0); | ||||
163 | |||||
164 | } | ||||
165 | |||||
166 | return $self->new($dest); | ||||
167 | } | ||||
168 | |||||
169 | sub move_to { | ||||
170 | my ($self, $dest) = @_; | ||||
171 | if (File::Copy::move($self->stringify, $dest)) { | ||||
172 | |||||
173 | my $new = $self->new($dest); | ||||
174 | |||||
175 | $self->{$_} = $new->{$_} foreach (qw/ dir file /); | ||||
176 | |||||
177 | return $self; | ||||
178 | |||||
179 | } else { | ||||
180 | |||||
181 | return; | ||||
182 | |||||
183 | } | ||||
184 | } | ||||
185 | |||||
186 | sub traverse { | ||||
187 | my $self = shift; | ||||
188 | my ($callback, @args) = @_; | ||||
189 | return $self->$callback(sub { () }, @args); | ||||
190 | } | ||||
191 | |||||
192 | sub traverse_if { | ||||
193 | my $self = shift; | ||||
194 | my ($callback, $condition, @args) = @_; | ||||
195 | return $self->$callback(sub { () }, @args); | ||||
196 | } | ||||
197 | |||||
198 | 1 | 2µs | 1; | ||
199 | __END__ | ||||
# spent 3µs within Path::Class::File::CORE:print which was called:
# once (3µs+0s) by Path::Class::File::spew at line 130 | |||||
# spent 6µs within Path::Class::File::CORE:readline which was called:
# once (6µs+0s) by Path::Class::File::slurp at line 113 |