$ cat test.conf fieldX:fieldY=123 fieldA:fieldB=234 $ cat t.pl #!/usr/bin/perl use warnings; use strict; { package MyConfig; use Tie::File; sub new { my ($class, $file) = @_; tie(my @config, "Tie::File", $file) or die("Failed to read ", $file, "\n ", $!); return bless \@config, $class; } sub setting { my $self = shift; my $line = shift; if (3 == grep { defined($_) } @_) { $self->[$line] = "$_[0]:$_[1]=$_[2]"; } else { return split /[:=]/, $self->[$line]; } } sub DESTROY { untie @{ $_[0] } } } use Data::Dumper; my $s = MyConfig->new("test.conf"); my @set1 = $s->setting(0); # at line 1 my @set2 = $s->setting(1); # at line 2 print Dumper \@set1, \@set2; $s->setting(1, "foo", "bar", "777"); # modify line 2 $s->setting(4, "baz", "red", "999"); # add line 5 __END__ $ t.pl $VAR1 = [ 'fieldX', 'fieldY', '123' ]; $VAR2 = [ 'fieldA', 'fieldB', '234' ]; $ cat test.conf fieldX:fieldY=123 foo:bar=777 baz:red=999