QuoteAm liebsten wäre mir eine sehr einfach gehaltene Lösung.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
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 main; #my $ref = Names->new({3 => 'Day', 4 => 'Month', 5 => 'Year'}, [localtime]); #printf qq(%s.%s.%s\n), $ref->{Day}, ++$ref->{Month}, $ref->{Year} + 1900; # #my $ff = Names->new({7 => 'Size'}, [stat('/tmp/numbers.bin')]); #print "$ff->{Size}\n";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
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; sub new{ my $class = shift; my $handle = shift; my $self = bless{ FH => $handle, COLS => { 0 => 'User', 1 => '/home', 2 => '/home/test', 3 => '/home/bin' }, DATA => {}, }, $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}; } ############################################# PRIVATE ##################### # 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; my $name = Names->new($self->{COLS}, \@record); $self->{DATA}->{$record[0]} = $name; # Key ist der Benutzername } } 1;######################################################################### package main; my $ref = CSV->new(*DATA); print $ref->user_dir_flag('otto','/home'), "\n"; # 1 print $ref->user_dir_flag('otto','/home/test'), "\n"; # 0 print $ref->user_dir_flag('otto','/home/bin'), "\n"; # 0 __END__ user;/home;/home/test;/home/bin fritz;0;1;0 otto;1;0;0 hans;1;1;1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
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;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
my @dirnames = qw(dir1 dir2 ...); my %permissions = ( user1 => { dir1 => 0, dir2 => 1, ... }, user2 => { dir1 => 1, ... }, ... ); # Ein Element setzen: $permissions{user1}{dir1} = 1; # usw. # Alles auslesen und in CSV speichern: open(my $csv, '>', 'CSV-FILE.csv') or die $!; select $csv; print ";$_" for @dirnames; print "\n"; for my $user (keys %permissions) { print "$user;"; for my $dir (@dirnames) { print $permissions{$user}{$dir} ? "1;" : "0;"; } print "\n"; } select STDOUT; close $csv;