📄 filecache.pm
字号:
package FileCache;=head1 NAMEFileCache - keep more files open than the system permits=head1 SYNOPSIS cacheout $path; print $path @data;=head1 DESCRIPTIONThe C<cacheout> function will make sure that there's a filehandle openfor writing available as the pathname you give it. It automaticallycloses and re-opens files if you exceed your system file descriptormaximum.=head1 BUGSF<sys/param.h> lies with its C<NOFILE> define on some systems,so you may have to set $FileCache::cacheout_maxopen yourself.=cutrequire 5.000;use Carp;use Exporter;@ISA = qw(Exporter);@EXPORT = qw( cacheout);# Open in their package.sub cacheout_open { my $pack = caller(1); open(*{$pack . '::' . $_[0]}, $_[1]);}sub cacheout_close { my $pack = caller(1); close(*{$pack . '::' . $_[0]});}# But only this sub name is visible to them.$cacheout_seq = 0;$cacheout_numopen = 0;sub cacheout { ($file) = @_; unless (defined $cacheout_maxopen) { if (open(PARAM,'/usr/include/sys/param.h')) { local ($_, $.); while (<PARAM>) { $cacheout_maxopen = $1 - 4 if /^\s*#\s*define\s+NOFILE\s+(\d+)/; } close PARAM; } $cacheout_maxopen = 16 unless $cacheout_maxopen; } if (!$isopen{$file}) { if (++$cacheout_numopen > $cacheout_maxopen) { my @lru = sort {$isopen{$a} <=> $isopen{$b};} keys(%isopen); splice(@lru, $cacheout_maxopen / 3); $cacheout_numopen -= @lru; for (@lru) { &cacheout_close($_); delete $isopen{$_}; } } cacheout_open($file, ($saw{$file}++ ? '>>' : '>') . $file) or croak("Can't create $file: $!"); } $isopen{$file} = ++$cacheout_seq;}1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -