Config-Context
view release on metacpan or search on metacpan
lib/Config/Context.pm view on Meta::CPAN
my @bad_spec_keys = grep { !$allowed_spec_keys{$_} } keys %$spec;
if (@bad_spec_keys) {
croak "Unknown spec option(s): ".(join ', ', @bad_spec_keys);
}
# Must have name and MatchType
my $name = $spec->{'name'} or croak "Spec #$count has no name";
my $match_type = $spec->{'match_type'} or croak "Spec #$count has no match_type";
my $path_sep = $spec->{'path_separator'} || '/';
my $section_priority = $spec->{'merge_priority'} || 0;
my $this_section_type = $spec->{'section_type'};
my $trim_section_names = exists $spec->{'trim_section_names'} ? $spec->{'trim_section_names'} : 1;
if ($self->{'lower_case_names'}) {
$name = lc $name;
$this_section_type = lc $this_section_type;
}
# Skip this section if the section's type does not match the type
# of the target string. But only do so if the target_string has a type.
if ($target_section_type) {
# If the target_string has a type but the section doesn't then skip
next unless $this_section_type;
# If the target_string doesn't equal the section string then skip
if ($target_section_type ne $this_section_type) {
next;
}
}
next unless exists $config->{$name};
my $sections = delete $config->{$name};
foreach my $section_string (keys %$sections) {
my $section_hash = $sections->{$section_string};
if ($trim_section_names) {
$section_string =~ s/^\s*(.*?)\s*$/$1/;
}
if ($match_type =~ /^exact$/i) {
if ($target_string eq $section_string) {
# store matches as array ref where first element is
# the section's MergePriority, the second element is
# the length and the third is the config hash of
# matching section
push @matches, [
$section_priority,
length($section_string),
$section_hash,
];
}
}
elsif ($match_type =~ /^substring$/i) {
if ((index $target_string, $section_string) != ($[ - 1)) {
# store matches as array ref where first element is
# the section's MergePriority, the second element is
# the length and the third is the config hash of
# matching section
push @matches, [
$section_priority,
length($section_string),
$section_hash,
];
}
}
elsif ($match_type =~ /^regex$/i) {
my $regex = qr/$section_string/;
if ($target_string =~ qr/($section_string)/) {
# store matches as array ref where first element is
# the section's MergePriority, the second element is
# the length and the third is the config hash of
# matching section
push @matches, [
$section_priority,
length($1),
$section_hash,
];
}
}
elsif ($match_type =~ /^path$/i or $match_type =~ /^hierarchy$/i) {
my $regex = quotemeta($section_string);
# If the section string ends with $path_sep then
# we have only to match the whole string
if (($section_string =~ /$path_sep$/ and $target_string =~ qr/^($regex)/)
# otherwise, we have to find the section_string either at
# the end of target_string or immediately followed by
# $path_sep in target string
or ($target_string =~ qr/^($regex)(?:$path_sep|$)/)) {
# store matches as array ref where first element is
# the section's MergePriority, the second element is
# the length and the third is the config hash of
# matching section
push @matches, [
$section_priority,
length($1),
$section_hash,
];
}
}
else {
croak "Bad match_type: $match_type";
}
}
}
return @matches;
}
( run in 0.542 second using v1.01-cache-2.11-cpan-5735350b133 )