use strict; use warnings; package Names; ########################################################################### # Rolf Rost, 14.2.2011 # Anonyme Array-Elemente bekommen Namen ########################################################################### use strict; # Setzt ein Array in ein Objekt um sub new{ my $class = shift; my $maps = shift; # {3 => 'Day', 4 => 'Month', 5 => 'Year'} my $aref = shift; # p.e. from localtime, stat, etc. return if ref $maps ne 'HASH'; return if ref $aref ne 'ARRAY'; my $self = {}; for(my $i = 0; $i < scalar(@$aref); $i++){ $self->{$maps->{$i}} = $aref->[$i] if exists $maps->{$i}; } return bless $self, $class; } 1; ######################################################################## package CSV; use IO::File; use Carp; sub new{ my $class = shift; my $file = shift or croak "No File"; my $handle = _handle($file) or croak "$!"; # die Spalten-Namen ergeben sich aus der ersten Zeile my $self = bless{ FH => $handle, COLS => {}, DATA => {}, FIRSTLINE => undef, FIRSTKEY => '', }, $class; $self->_deserialize; return $self; } ####################### PUBLIC ############################################ # Flags sub user_dir_flag{ my $self = shift; my $user = shift; my $dir = shift; return $self->{DATA}->{$user}->{$dir}; } # Flag sezten sub flag{ my($self, $user, $dir, $flag) = @_; $self->{DATA}->{$user}->{$dir} = $flag; } # Datei speichern, serialize sub store{ my $self = shift; my $fh = $self->{FH}; truncate $fh, 0; seek $fh, 0,0; # Erste Zeile muss stimmem # print in das handle print $fh "$self->{FIRSTLINE}\n"; # den ersten Key aus Data löschen delete $self->{DATA}->{$self->{FIRSTKEY}}; # $key ist der Benutzer foreach my $key(sort keys %{$self->{DATA}}){ # Zeile wieder ordnungsgemäß zusammenbauen my @record = (); # später join ";" push @record, $key; for( my $col = 1; $col < scalar(keys %{$self->{COLS}}); $col++){ push @record, $self->{DATA}->{$key}->{$self->{COLS}->{$col}}; } print $fh join(";", @record)."\n"; } } ############################################# PRIVATE ##################### sub _handle{ my $file = shift; my $fh = new IO::File $file, O_RDWR; return defined $fh ? $fh : undef; # IO-Error in $! } ########################################################################### # Lesen der Daten auf eine Datenstruktur sub _deserialize{ my $self = shift; my $fh = $self->{FH}; while(my $line = <$fh>){ chomp $line; my @record = split ";", $line; # Spaltennamen aus der ersten Zeile ermitteln if($. == 1){ $self->{FIRSTLINE} = $line; $self->{FIRSTKEY} = $record[0]; for(my $i = 0; $i < scalar @record; $i++){ $self->{COLS}->{$i} = $record[$i]; } } my $name = Names->new($self->{COLS}, \@record); $self->{DATA}->{$record[0]} = $name; # Key ist der Benutzername } } 1;######################################################################### package main; my $ref = CSV->new('userdirs.csv'); # einen Wert setzen $ref->flag('otto', '/home', 0); print $ref->user_dir_flag('otto','/home'), "\n"; print $ref->user_dir_flag('otto','/home/test'), "\n"; print $ref->user_dir_flag('otto','/home/bin'), "\n"; # Alles wieder speichern $ref->store;