This repository is private.
All pages are served over SSL and all pushing and pulling is done over SSH.
No one may fork, clone, or view it unless they are added as a member.
Every repository with this icon (
) is private.
Every repository with this icon (
This repository is public.
Anyone may fork, clone, or view it.
Every repository with this icon (
) is public.
Every repository with this icon (
| name | age | message | |
|---|---|---|---|
| |
.cvsignore | ||
| |
.gitignore | ||
| |
.screenrc | ||
| |
Changes | ||
| |
GNUmakefile | ||
| |
MANIFEST | ||
| |
Makefile.PL | ||
| |
README | ||
| |
lib/ | ||
| |
profile-Path-Abstract.pl | ||
| |
profile-Path-Class.pl | ||
| |
scratch/ | ||
| |
t/ |
README
NAME
Path::Abstract - Fast and featureful UNIX-style path parsing and
manipulation
VERSION
Version 0.095
SYNOPSIS
use Path::Abstract;
my $path = Path::Abstract->new( '/apple/banana' )
# $parent is '/apple'
my $parent = $path->parent
# $cherry is '/apple/banana/cherry.txt'
my $cherry = $path->child( "cherry.txt" )
path( '/a/b/c/' )->list # ( 'a', 'b', 'c' )
path( '/a/b/c/' )->split # ( '/a', 'b', 'c/' )
path( '/a/b/c/' )->first # a
path( '/a/b/c/' )->beginning # /a
path( '/a/b/c/' )->last # c
path( '/a/b/c/' )->ending # c/
path( '/a/b/c/' ).at(0) # a (equivalent to ->first)
path( '/a/b/c/' ).at(-1) # c (equivalent to ->last)
path( '/a/b/c/' ).at(1) # b
$path = path( 'a/b/c' )
$path->append( 'd', 'ef/g', 'h' ) # a/b/cd/ef/g/h
path( 'a/b/c.html' )->extension # .html
path( 'a/b/c' )->extension # ''
path( 'a/b/c.tar.gz' )->extension # .gz
path( 'a/b/c.tar.gz' )->
extension({ match: '*' }) # .tar.gz
path( 'a/b/c.html' )->extension( '.txt' ) # a/b/c.txt
path( 'a/b/c.html' )->extension( 'zip' ) # a/b/c.zip
path( 'a/b/c.html' )->extension( '' ) # a/b/c
path( 'a/b/c' )->down( 'd/e' ) # a/b/c/d/e
path( 'a/b/c' )->child( 'd/e' ) # a/b/c/d/e (Same as ->down except
# returning a new path instead of
# modifying the original)
path( 'a/b/c' )->up # a/b
path( 'a/b/c' )->parent # a/b (Same as ->up except
# returning a new path instead of
# modifying the original)
DESCRIPTION
Path::Abstract is a tool for parsing, interrogating, and modifying a
UNIX-style path. The parsing behavior is similar to File::Spec::Unix,
except that trailing slashes are preserved (converted into a single
slash).
Different behavior since 0.093
Some methods of Path::Abstract have changed since 0.093 with the goal of
having better/more consistent behavior
Unfortunately, this MAY result in code that worked with 0.093 and
earlier be updated to reflect the new behavior
The following has changed:
$path->list
The old behavior (kept the leading slash but dropped trailing slash):
path('/a/b/c/')->list # ( '/a', 'b', 'c' )
path('a/b/c/')->list # ( 'a', 'b', 'c' )
The new behavior (neither slash is kept):
path('/a/b/c/')->list # ( 'a', 'b', 'c' )
path('a/b/c/')->list # ( 'a', 'b', 'c' )
In addition, $path->split was an alias for $path->list, but this has
changed. Now split WILL keep BOTH leading and trailing slashes (if any):
path('/a/b/c/')->split # ( '/a', 'b', 'c/' )
path('a/b/c/')->split # ( 'a', 'b', 'c/' )
path('a/b/c')->split # ( 'a', 'b', 'c' ) Effectively equivalent to ->list
$path->split
See the above note on $path->list
$path->first
The old behavior:
1. Would return undef for the empty path
2. Would include the leading slash (if present)
3. Would NOT include the trailing slash (if present)
path(undef)->first # undef
path('')->first # undef
path('/a')->first # /a
path('/a/')->first # /a
path('a')->first # a
The new behavior:
1. Always returns at least the empty string
2. Never includes any slashes
path(undef)->first # ''
path('')->first # ''
path('/a')->first # a
path('/a/')->first # a
path('a')->first # a
For an alternative to ->first, try ->beginning
$path->last
Simlar to ->first
The old behavior:
1. Would return undef for the empty path
2. Would include the leading slash (if present)
3. Would NOT include the trailing slash (if present)
path(undef)->last # undef
path('')->last # undef
path('/a')->last # /a
path('/a/')->last # /a
path('a')->last # a
path('a/b')->last # b
path('a/b/')->last # b
The new behavior:
1. Always returns at least the empty string
2. Never includes any slashes
path(undef)->last # ''
path('')->last # ''
path('/a')->last # a
path('/a/')->last # a
path('a')->last # a
path('a/b')->last # b
path('a/b/')->last # b
For an alternative to ->last, try ->ending
$path->is_branch
The old behavior:
1. The empty patch ('') would not be considered a branch
The new behavior:
1. The empty patch ('') IS considered a branch
METHODS
Path::Abstract->new( <path> )
Path::Abstract->new( <part>, [ <part>, ..., <part> ] )
Create a new "Path::Abstract" object using <path> or by joining each
<part> with "/"
Returns the new "Path::Abstract" object
Path::Abstract::path( <path> )
Path::Abstract::path( <part>, [ <part>, ..., <part> ] )
Create a new "Path::Abstract" object using <path> or by joining each
<part> with "/"
Returns the new "Path::Abstract" object
$path->clone
Returns an exact copy of $path
$path->set( <path> )
$path->set( <part>, [ <part>, ..., <part> ] )
Set the path of $path to <path> or the concatenation of each <part>
(separated by "/")
Returns $path
$path->is_nil
$path->is_empty
Returns true if $path is equal to ""
$path->is_root
Returns true if $path is equal to "/"
$path->is_tree
Returns true if $path begins with "/"
path("/a/b")->is_tree # Returns true
path("c/d")->is_tree # Returns false
$path->is_branch
Returns true if $path does NOT begin with a "/"
path("")->is_branch # Returns true
path("/")->is_branch # Returns false
path("c/d")->is_branch # Returns true
path("/a/b")->is_branch # Returns false
$path->to_tree
Change $path by prefixing a "/" if it doesn't have one already
Returns $path
$path->to_branch
Change $path by removing a leading "/" if it has one
Returns $path
$path->list
Returns the path in list form by splitting at each "/"
path("c/d")->list # Returns ("c", "d")
path("/a/b/")->last # Returns ("a", "b")
NOTE: This behavior is different since 0.093 (see above)
$path->split
$path->first
Returns the first part of $path up to the first "/" (but not including
the leading slash, if any)
path("c/d")->first # Returns "c"
path("/a/b")->first # Returns "a"
This is equivalent to $path->at(0)
$path->last
Returns the last part of $path up to the last "/"
path("c/d")->last # Returns "d"
path("/a/b/")->last # Returns "b"
This is equivalent to $path->at(-1)
$path->at( $index )
Returns the part of path at $index, not including any slashes You can
use a negative $index to start from the end of path
path("/a/b/c/").at(0) # a (equivalent to $path->first)
path("/a/b/c/").at(-1) # c (equivalent to $path->last)
path("/a/b/c/").at(1) # b
$path->beginning
Returns the first part of path, including the leading slash, if any
path("/a/b/c/")->beginning # /a
path("a/b/c/")->beginning # a
$path->ending
Returns the first part of path, including the leading slash, if any
path("/a/b/c/")->ending # c/
path("/a/b/c")->ending # c
$path->get
$path->stringify
Returns the path in string or scalar form
path("c/d")->list # Returns "c/d"
path("/a/b/")->last # Returns "/a/b"
$path->push( <part>, [ <part>, ..., <part> ] )
$path->down( <part>, [ <part>, ..., <part> ] )
Modify $path by appending each <part> to the end of \$path, separated by
"/"
Returns $path
path( "a/b/c" )->down( "d/e" ) # a/b/c/d/e
$path->child( <part>, [ <part>, ..., <part> ] )
Make a copy of $path and push each <part> to the end of the new path.
Returns the new child path
path( "a/b/c" )->child( "d/e" ) # a/b/c/d/e
$path->append( $part1, [ $part2 ], ... )
Modify path by appending $part1 WITHOUT separating it by a slash. Any,
optional, following $part2, ..., will be separated by slashes as normal
$path = path( "a/b/c" )
$path->append( "d", "ef/g", "h" ) # "a/b/cd/ef/g/h"
$path->extension
Returns the extension of path, including the leading the dot
Returns "" if path does not have an extension
path( "a/b/c.html" )->extension # .html
path( "a/b/c" )->extension # ""
path( "a/b/c.tar.gz" )->extension # .gz
path( "a/b/c.tar.gz" )->extension({ match: "*" }) # .tar.gz
$path->extension( $extension )
Modify path by changing the existing extension of path, if any, to
$extension
path( "a/b/c.html" )->extension( ".txt" ) # a/b/c.txt
path( "a/b/c.html" )->extension( "zip" ) # a/b/c.zip
path( "a/b/c.html" )->extension( "" ) # a/b/c
Returns path
$path->pop( <count> )
Modify $path by removing <count> parts from the end of $path
Returns the removed path as a "Path::Abstract" object
$path->up( <count> )
Modify $path by removing <count> parts from the end of $path
Returns $path
$path->parent( <count> )
Make a copy of $path and pop <count> parts from the end of the new path
Returns the new parent path
$path->file
$path->file( <part>, [ <part>, ..., <part> ] )
Create a new "Path::Class::File" object using $path as a base, and
optionally extending it by each <part>
Returns the new file object
$path->dir
$path->dir( <part>, [ <part>, ..., <part> ] )
Create a new "Path::Class::Dir" object using $path as a base, and
optionally extending it by each <part>
Returns the new dir object
SEE ALSO
Path::Class
File::Spec::Unix
File::Spec
Path::Resource
Path::Abstract::Underload
URI::PathAbstract
AUTHOR
Robert Krimen, "<rkrimen at cpan.org>"
SOURCE
You can contribute or fork this project via GitHub:
<http://github.com/robertkrimen/path-abstract/tree/master>
git clone git://github.com/robertkrimen/path-abstract.git Path-Abstract
BUGS
Please report any bugs or feature requests to "bug-path-lite at
rt.cpan.org", or through the web interface at
<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Path-Abstract>. I will
be notified, and then you'll automatically be notified of progress on
your bug as I make changes.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Path::Abstract
You can also look for information at:
* AnnoCPAN: Annotated CPAN documentation
<http://annocpan.org/dist/Path-Abstract>
* CPAN Ratings
<http://cpanratings.perl.org/d/Path-Abstract>
* RT: CPAN's request tracker
<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Path-Abstract>
* Search CPAN
<http://search.cpan.org/dist/Path-Abstract>
ACKNOWLEDGEMENTS
Thanks to Joshua ben Jore, Max Kanat-Alexander, and Scott McWhirter for
discovering the "use overload ..." slowdown issue.
COPYRIGHT & LICENSE
Copyright 2007 Robert Krimen, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.








