File-Sticker
view release on metacpan or search on metacpan
lib/File/Sticker/Scribe.pm view on Meta::CPAN
my $field = $args{field};
} # delete_field_from_file
=head2 replace_all_meta
Overwrite the existing meta-data with that given.
$scribe->replace_all_meta(filename=>$filename,meta=>\%meta);
=cut
sub replace_all_meta {
my $self = shift;
my %args = @_;
say STDERR whoami() if $self->{verbose} > 2;
my $filename = $args{filename};
my $meta = $args{meta};
# overwrite the known writable fields
# ignore the unknown fields
my $writable = $self->writable_fields();
foreach my $field (sort keys %{$writable})
{
if (exists $meta->{$field}
and defined $meta->{$field})
{
$self->replace_one_field(filename=>$filename,
field=>$field,
value=>$meta->{$field});
}
else # not there, remove it
{
$self->delete_field_from_file(filename=>$filename,field=>$field);
}
}
} # replace_all_meta
=head1 Helper Functions
Private interface.
=head2 update_multival_field
A multi-valued field could have individual values added or removed from it.
This expects a comma-separated list of individual values, prefixed with an operation:
'+' or nothing -- add the values
'-' -- remove the values
'=' -- replace the values
This also needs to know the existing values of the multi-valued field.
The old values are either a reference to an array, or a string with comma-separated values.
$scribe->update_multival_field(filename=>$filename,
field=>$field_name,
value=>$value,
old_vals=>$old_vals);
=cut
sub update_multival_field {
my $self = shift;
my %args = @_;
say STDERR whoami() if $self->{verbose} > 2;
my $filename = $args{filename};
my $field = $args{field};
my $value = $args{value};
my $old_vals = $args{old_vals};
if ($self->{verbose} > 2 and ref $value)
{
say STDERR "$field is ", ref $value, " ", Dump($value);
}
my $prefix = '+';
if ($value =~ /^([+=-])(.*)/)
{
$prefix = $1;
$value = $2;
}
say STDERR "prefix='$prefix'" if $self->{verbose} > 2;
if ($prefix eq '=')
{
$self->replace_one_field(
filename=>$filename,
field=>$field,
value=>$value);
}
else
{
if ($prefix eq '-')
{
$self->delete_multival_from_file(
filename=>$filename,
field=>$field,
value=>$value,
old_vals=>$old_vals);
}
else
{
$self->add_multival_to_file(
filename=>$filename,
field=>$field,
value=>$value,
old_vals=>$old_vals);
}
}
} # update_multival_field
=head2 add_multival_to_file
Add a multi-valued field to the file.
Needs to know the existing values of the multi-valued field.
The old values are either a reference to an array, or a string with comma-separated values.
$scribe->add_multival_to_file(filename=>$filename,
field=>$field_name,
value=>$value,
old_vals=>$old_vals);
=cut
( run in 0.821 second using v1.01-cache-2.11-cpan-e1769b4cff6 )