Algorithm-Dependency
view release on metacpan or search on metacpan
lib/Algorithm/Dependency/Source/File.pm view on Meta::CPAN
use Algorithm::Dependency::Source ();
our $VERSION = '1.112';
our @ISA = 'Algorithm::Dependency::Source';
#####################################################################
# Constructor
#pod =pod
#pod
#pod =head2 new $filename
#pod
#pod When constructing a new Algorithm::Dependency::Source::File object, an
#pod argument should be provided of the name of the file to use. The constructor
#pod will check that the file exists, and is readable, returning C<undef>
#pod otherwise.
#pod
#pod =cut
sub new {
my $class = shift;
my $filename = shift or return undef;
return undef unless -r $filename;
# Get the basic source object
my $self = $class->SUPER::new() or return undef;
# Add our arguments
$self->{filename} = $filename;
$self;
}
#####################################################################
# Private Methods
sub _load_item_list {
my $self = shift;
# Load the contents of the file
local $/ = undef;
open( FILE, $self->{filename} ) or return undef;
defined(my $source = <FILE>) or return undef;
close( FILE ) or return undef;
# Split, trim, clean and remove comments
my @content = grep { ! /^\s*(?:\#|$)/ }
split /\s*[\015\012][\s\015\012]*/, $source;
# Parse and build the item list
my @Items = ();
foreach my $line ( @content ) {
# Split the line by non-word characters
my @sections = grep { length $_ } split /\W+/, $line;
return undef unless scalar @sections;
# Create the new item
my $Item = Algorithm::Dependency::Item->new( @sections ) or return undef;
push @Items, $Item;
}
\@Items;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Algorithm::Dependency::Source::File - File source for dependency hierarchies
=head1 VERSION
version 1.112
=head1 DESCRIPTION
Algorithm::Dependency::Source::File implements a
L<source|Algorithm::Dependency::Source> where the items are stored in a flat
file or a relatively simple format.
=head2 File Format
The file should be an ordinary text file, consisting of a series of lines,
with each line completely containing the information for a single item.
Blank lines, or lines beginning with the hash character '#' will be
ignored as comments.
For a single item line, only word characters will be used. A 'word character'
consists of all letters and numbers, and the underscore '_' character.
Anything that is not a word character will be assumed to be a separator.
The first word will be used as the name or id of the item, and any further
words in the line will be used as other items that this one depends on. For
example, all of the following are legal.
# A single item with no dependencies
Foo
# Another item that depends on the first one
Bar Foo
# Depending on multiple others
Bin Foo Bar
# We can use different separators
One:Two|Three-Four+Five=Six Seven
# We can also use multiple non-word characters as separators
This&*&^*&File: is& & & :::REALLY()Neat
From the examples above, it should be easy to create your own files.
( run in 1.221 second using v1.01-cache-2.11-cpan-39bf76dae61 )