#!/usr/bin/perl use strict; use warnings; use Data::Dumper; print Dumper(parse('file.sec')); sub parse { my $file=shift; return undef unless($file); my $sec=shift; my $fname=shift; my %ret; open(my $fh, '<', $file) or die("error open $file $!\n"); if(<$fh> ne "SECFILE V2\n") { warn("Ungültiges Dateiformat!\n"); return undef; } my $trenner=<$fh>; local $/="\n$trenner"; my $section=$sec?undef:'DEFAULT'; while(my $block=<$fh>) { chomp($block); $block=~s/^\s+//s; my ($type,$name,$data)=split(/\n/,$block,3); next unless(defined($type)); $name=~s/^\s+//; if($type eq 'SECTION') { if(defined($sec)) { if($name eq $sec) { $section=$name } else { $section=undef; } } else { $section=$name; } } elsif($type eq 'FILE') { next unless(defined($section)); $data='' unless(defined($data)); if(defined($fname)) { $ret{$section}{$name}=$data if($fname eq $name); } else { $ret{$section}{$name}=$data }; } elsif($type eq 'COMMENT'){} # mache nichts... else { warn("Unbekannter Blocktyp: $type, Wird ignoriert!\n");} } close $fh; return \%ret; }