📄 file.pm
字号:
package URI::URL::file;require URI::URL::_generic;@ISA = qw(URI::URL::_generic);require Carp;require Config;# First we try to determine what kind of system we run onmy $os = $Config::Config{'osname'};OS: { $ostype = 'vms', last if $os eq 'VMS'; $ostype = 'dos', last if $os =~ /^(?:os2|mswin32|msdos)$/i; $ostype = 'mac', last if $os eq "Mac"; $ostype = 'unix'; # The default}# NOTE: If you add more types to this list, remember to add a xxx_path# method as well.# This is the BNF found in RFC 1738:## fileurl = "file://" [ host | "localhost" ] "/" fpath# fpath = fsegment *[ "/" fsegment ]# fsegment = *[ uchar | "?" | ":" | "@" | "&" | "=" ]# Note that fsegment can contain '?' (query) but not ';' (param)sub _parse { my($self, $init) = @_; # The file URL can't have query $self->URI::URL::_generic::_parse($init, qw(netloc path params frag));}# sub local_path { ... }## Returns a path suitable for use on the local system (we just# set up an alias (derived from $ostype) to one of the path methods# defined below)*local_path = \&{$ostype . "_path"};*query = \&URI::URL::bad_method;*equery = \&URI::URL::bad_method;# A U T O L O A D E R# Don't remove this comment, it keeps AutoSplit happy!!# @ISA = qw(AutoLoader)## These methods are autoloaded as neededsub newlocal;sub unix_path;sub dos_path ;sub mac_path ;sub vms_path ;1;__END__sub newlocal { my($class, $path) = @_; Carp::croak("Only implemented for Unix and OS/2 file systems") unless $ostype eq "unix" or $^O =~ /os2|mswin32/i; # XXX: Should implement the same thing for other systems my $url = new URI::URL "file:"; unless (defined $path and ($path =~ m:^/: or ($^O eq 'os2' and Cwd::sys_is_absolute($path)) or ($^O eq 'MSWin32' and $path =~ m<^[A-Za-z]:[\\/]|^[\\/]{2}>))) { require Cwd; my $cwd = Cwd::fastcwd(); $cwd =~ s:/?$:/:; # force trailing slash on dir $path = (defined $path) ? $cwd . $path : $cwd; } $url->path($path); $url;}sub unix_path{ my $self = shift; my @p; for ($self->path_components) { Carp::croak("Path component contains '/' or '\0'") if m|[\0/]|; if (@p) { next unless length $_; # skip empty path segments next if $_ eq '.'; # skip these too if ($_ eq '..' && $p[-1] ne '..') { # go up one level pop(@p) if $p[-1] ne ''; next; } } push(@p, $_); } shift(@p) if @p > 1 && $p[0] eq '.'; # './' rendundant if there is more return '/' if !@p || (@p == 1 && $p[0] eq ''); join('/', @p);}sub dos_path{ my $self = shift; my @p; for ($self->path_components) { Carp::croak("Path component contains '/' or '\\'") if m|[/\\]|; push(@p, uc $_); } my $p = join("\\", @p); $p =~ s/^\\([A-Z]:)/$1/; # Fix drive letter specification $p;}sub mac_path{ my $self = shift; my @p; for ($self->path_components) { Carp::croak("Path component contains ':'") if /:/; # XXX: Should probably want to do something about ".." and "." # path segments. I don't know how these are represented in # the Machintosh file system. If these are valid file names # then we should split the path ourself, as $u->path_components # loose the distinction between '.' and '%2E'. push(@p, $_); } if (@p && $p[0] eq '') { shift @p; } else { unshift(@p, ''); } join(':', @p);}sub vms_path{ # ????? Can some VMS people please redo this function ?????? # This is implemented based on what RFC1738 (sec 3.10) says in the # VMS file example: # # DISK$USER:[MY.NOTES]NOTE123456.TXT # # that might become # # file:/disk$user/my/notes/note12345.txt # # BEWARE: I don't have a VMS machine myself so this is pure guesswork!!! my $self = shift; my @p = $self->path_components; my $abs = 0; if (@p && $p[0] eq '') { shift @p; $abs = 1; } # First I assume there must be a dollar in a disk spesification my $p = ''; $p = uc(shift(@p)) . ":" if @p && $p[0] =~ /\$/; my $file = pop(@p); $p .= "[" . join(".", map{uc($_)} @p) . "]" if @p; $p .= uc $file; # XXX: How is an absolute path different from a relative one?? $p =~ s/\[/[./ unless $abs; # XXX: How is a directory denoted?? $p;}1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -