#!/usr/bin/perl -wCSD use strict; use warnings; use YAML::XS; use Scalar::Util qw(looks_like_number); my ($file, $option) = @ARGV; unless (defined($file)) { print {*STDERR} ("1st parameter 'file' is not defined\n"); exit (1); } unless (defined($option)) { print {*STDERR} ("2nd parameter 'option' is not defined\n"); exit (1); } my $yaml = YAML::XS::LoadFile($file); my $valref = \$yaml; my @path = split(/\./, $option); my $delete_element = pop(@path); for my $component (@path) { if (ref($valref) eq 'SCALAR' && defined(${$valref})) { print {*STDERR} ("Key resolved to a SCALAR at '$component'; cannot continue.\n"); exit (1); } elsif (looks_like_number($component) && (! defined(${$valref}) || ref(${$valref}) eq 'ARRAY')) { $valref = \${$valref}->[$component]; } elsif (! defined(${$valref}) || ref(${$valref}) eq 'HASH') { $valref = \${$valref}->{$component}; } else { print {*STDERR} ("Key resolved to a " . ref(${$valref}) . " reference; refusing to overwrite.\n"); exit (1); } } delete ${$valref}->{$delete_element}; YAML::XS::DumpFile($file, $yaml);