Author image Dale Amon
and 1 contributors

NAME

 File::Spec::BaseParse - Parse a basic file name spec in a system independant way.

SYNOPSIS

 use File::Spec::BaseParse;

 $obj = File::Spec::BaseParse->new ($pathname);
 $obj = File::Spec::BaseParse->new;

 ($volume, $basepath, $directory, $name, @extensions) = $obj->splitpath ($filepath);

 $pathname     = $obj->pathname;
 $volume       = $obj->volume;
 $rootpath     = $obj->rootpath;
 $basepath     = $obj->basepath;
 $directory    = $obj->directory;
 $filename     = $obj->filename;
 $name         = $obj->name;
 @extensions   = $obj->extensions;
 $extensions   = $obj->extensions;
 $extension    = $obj->extension;
 $obj          = $obj->set_volume ($volume);
 $obj          = $obj->set_rootpath ($rootpath);
 $obj          = $obj->set_filename ($filename);
 $obj          = $obj->set_basepath  ($basepath);
 $obj          = $obj->set_directory ($directory);
 $obj          = $obj->set_name ($name);
 $obj          = $obj->set_extensions (@extensions);
 $filename     = $obj->reset_filename;
 $pathname     = $obj->reset_pathname;
 $rootpath     = $obj->reset_rootpath; 
 ($volume, $basepath, $directory, $filename) = $obj->reparse;

Inheritance

 UNIVERSAL
   File::Spec::Unix
     File::Spec::BaseParse

Description

Split a file pathname into (mostly) system independent parts via the parent class File::Spec::Unix. The resultant rootpath is additionally split into a basepath and directory, and the filename into name and extensions.

For example, /my/base/Cards/19901225-XMAS-Title-Subtitle-note.tar.gz would be split up as:

 volume:      undef
 basepath:    /my/base
 directory:   Cards
 filename:    19901225-XMAS-Title-Subtitle-note.tar.gz
 name:        19901225-XMAS-Title-Subtitle-note
 extensions:  gz
 extensions:  tar gz

At the moment the directory is split in a non-system -independent way.

[Not doing much with _dirty flag yet. Set it in all set's, clear it on _init. Doesn't matter on resets because they won't make any changes unless the ivars they used were changed, in which case it was touched already. Could do lazy evaluation if I chose to. Then I could dump all the reset and reparse methods right down through all the child classes.]

[Should initialization of unused fields default to undef as it does now, or should it be null strings, ""? The undef's seem to be working well enough, but it is worth reconsidering this point.]

Examples

 use File::Spec::BaseParse;
 my $baz       = File::Spec::BaseParse->new;
 my @list      = $baz->splitpath
                ("/my/base/Cards/19901225-XMAS-Title-Subtitle-note.tar.gz");

 my $foo       = File::Spec::BaseParse->new
                ("/my/base/Cards/19901225-XMAS-Title-Subtitle-note.tar.gz");

 my $pathname  = $foo->pathname;
 my $volume    = $foo->volume;
 my $rootpath  = $foo->rootpath;
 my $basepath  = $foo->basepath;
 my $directory = $foo->directory;
 my $filename  = $foo->filename;

 $foo->set_volume     ("C:/");
 $foo->set_rootpath   ("/root/Cards/" );
 $foo->set_filename   ("/my/base/Cards/19901225-XMAS-Title-Subtitle-note.ps")
 my $path      = $foo->reset_pathname;
 my @parts     = $foo->reparse;

 $foo->set_basepath   ("/my/base");
 $foo->set_directory  ("Cards");
 my $rootpath  = $foo->reset_rootpath;
 my $path      = $foo->reset_pathname;
 my @parts     = $foo->reparse;

 $foo->set_name       ("SomethingSimpler");
 $foo->set_extensions ("tar", gz);
 my $filename  = $foo->reset_filename;
 my $rootpath  = $foo->reset_rootpath;
 my $path      = $foo->reset_pathname;
 my @parts     = $foo->reparse;

Class Variables

 None.

Instance Variables

 pathname      Unmodified version of the pathname string.
 volume        Volume name string as returned by parent class.
 rootpath      Path string as returned by the parent class. We split it into
               basepath and directory.
 basepath      rootpath string less the rightmost subdirectory. It may be a
               null string if rootpath is / because the / will be assigned to
               directory.
 directory     The rightmost subdirectory of rootpath.
 filename      The filename string as returned by the parent class.
 name          The portion of the filename left of the first dot.
 extensions    A list of dot separated elements right of the first dot.
 extension     The rightmost element of the list of extensions.
 tail          The ivar name of the parsed item containing the rightmost 
               portion of the original name.

Class Methods

$obj = File::Spec::BaseParse->new ($pathname)

Create a new object for $pathname. Returns the new object. Might someday return undef on failure... but just now I can't think of anything that is illegal as a Unix filename so it doesn't fail yet.

$obj = File::Spec::BaseParse->new

Create a new object with an undef pathname. Use this when the need is for an object to act as a generic filepath name parser / syntax checker.

Instance Methods

$basepath = $obj->basepath

Return the base path string.

$directory = $obj->directory

Return the directory string.

$extension = $obj->extension

Return the rightmost extension or undef if none.

@extensions = $obj->extensions
$extensions = $obj->extensions

Return the extensions as a list in array context ("tar","gz") or as a string in a scalar context ("tar.gz"). undef if there are no extensions.

$filename = $obj->filename

Return the filename string.

$name = $obj->name

Return the name string, the portion of a filename left of the first dot.

$pathname = $obj->pathname

Return the original, full path name string.

$filename = $obj->reset_filename

Regenerate filename from parts:

        name + extensions -> filename
$pathname = $obj->reset_pathname

Regenerate pathname from parts:

        volume + rootpath + filename -> pathname
($volume, $basepath, $directory, $filename) = $obj->reparse

Reparse the full pathname. Does a splitpath on the current contents of the pathname ivar. Use this method after a a group of set and reset commands to confirm the modified filepath is valid. Returns the same values as splitpath.

$rootpath = $obj->reset_rootpath

Regenerate rootpath from parts:

        basepath + directory -> rootpath
$rootpath = $obj->rootpath

Return the root path string.

$obj = $obj->set_basepath ($basepath)

Unconditionally set the basepath ivar.

$obj = $obj->set_directory ($directory)

Unconditionally set the directory ivar.

$obj = $obj->set_extensions (@extensions)

Unconditionally set the extensions list of the filename.

$obj = $obj->set_filename ($filename)

Unconditionally set the filename ivar.

$obj = $obj->set_name ($name)

Unconditionally set the body of the name.

$obj = $obj->set_rootpath ($rootpath)

Unconditionally set the rootpath ivar.

$obj = $obj->set_volume ($volume)

Unconditionally set the volume ivar.

($volume, $basepath, $directory, $name, @extensions) = $obj->splitpath ($filepath)

Returns all the elements of the pathname as a list. Undef or blank $filepaths are allowed and leave the object in the init state. Completely reinitializes the object for the name $filepath. Would return scalar undef on failure if I could think of anything that could fail...

$volume = $obj->volume

Return the volume name string.

Private Class Methods

 None.

Private Instance Methods

$obj= $obj->_init

Internal initializer.

This method is for the subclass initializer chaining and should not be used otherwise.

$obj = $obj->_append_extensions_to_tail

Internal parse helper function. Examines 'tail' ivar to see if it is defined; if it is, the contents are used as the name of a second ivar. That ivar should contain the rightmost portion of the original filename. The extensions are appended to that and returned as the value.

It sets all fields to undef or zero as appropriate. This ensures all required fields exist, even if we do not store to them later.

This method is for the subclass convenience and should not be used otherwise.

Subclasses use this method internally, but it is not intended for use outside of the family as it were.

$obj = $obj->_err ($msg)

Internal error handling. Doesn't print format error problems at the point of occurence. We also do not want to die or log at that point. So we just save it until we are ready to deal with it.

This method is for the subclass convenience and should not be used otherwise.

Subclasses use this method internally, but it is not intended for use outside of the family as it were.

$tailext = $obj->_parse_extensions_from_tail

Break a string up into dot delimited lexemes. The leftmost string is returned as value and assumed to not be an extension; the rest of the string is stored as 'extensions'; the rightmost extension is stored as 'extension'. If there are no extensions, both are undef.

'tail' will always be set to the name of the rightmost syntactic entity found thus far. Extensions will thus be parsed off the last, smallest, rightmost entity of which we are aware.

Returns the portion of tail string left of first dot or the entire string if no dots. It will be an empty string if dot is the first character.

KNOWN BUGS

 See TODO.

SEE ALSO

File::Spec::Unix, Fault::DebugPrinter

AUTHOR

Dale Amon <amon@vnl.com>

3 POD Errors

The following errors were encountered while parsing the POD:

Around line 356:

=back doesn't take any parameters, but you said =back 4

Around line 461:

=back doesn't take any parameters, but you said =back 4

Around line 518:

=back doesn't take any parameters, but you said =back 4