|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Mehrere Hashes...
|
Seitenanfang |
Hallo, ich möchte die unten stehenden Daten in einer HTML Tabelle anzeigen.Wie kann ich die Daten in eine Hash (Schlüssel:username), Subhash (Schlüssel: hostname) und als Werte die jeweiligen Rechte zum usernamen/hostnamen speichern und entsprechend ausgeben? Weiss jemand eine Lösung? # Ausgabe als HTML Tabelle: # +-----------+---------+---------+ # | username | hostname| rechte | # +-----------+---------+---------+ # | mschulz | lina | sysadm | # | | | sysop | # | | | smbadm | # | +---------+---------+ # | | lara | sysadm | # | +---------+---------+ # | | xenia | sysadm | # | | | sysop | # | | | oracle | # | | | mysql | # +-----------+---------+---------+ # | sysadm | lina | sysadm | # | +---------+---------+ # | | lara | sysadm | # | +---------+---------+ # | | xenia | sysadm | # +-----------+---------+---------+# Daten: __DATA__ mschulz|lina|sysadm,sysop,smbadm mschulz|lara|sysadm mschulz|xenia|sysadm,sysop,oracle,mysql sysadm|lina|sysadm sysadm|lara|sysadm sysadm|xenia|sysadm
Datum: 14.12.2005-23:18

|
re: Mehrere Hashes...
|
Seitenanfang |
| Hi, wo ist Dein bisheriger Code? Was hat erselbst bisher versucht? Gruss, svenXY
Datum: 15.12.2005-09:06

|
re: Mehrere Hashes...
|
Seitenanfang |
Das ist der Code, nur werden die letzten Daten (Rechte) überschrieben und erhalte immer nut sysadm. #!/usr/bin/perlmy (%HASH); while (<DATA>) { chomp; my @line=split(/\|/, $_); my $key=$line[0]; my $sub=$line[1]; shift @line; shift @line; $HASH{$key}=$sub; $SUBHASH{$sub}="@line"; } foreach my $keys(sort keys %HASH) { print $keys.":\n"; foreach (sort keys %SUBHASH) { print $_." - ".$SUBHASH{$_}."\n"; } } __DATA__ mschulz|lina|sysadm,sysop,smbadm mschulz|lara|sysadm mschulz|xenia|sysadm,sysop,oracle,mysql sysadm|lina|sysadm sysadm|lara|sysadm sysadm|xenia|sysadm
Habe ein Howto zu Perl & Hash gefunden. Will sehen das ich das mit dem Punkt "Access and print a reference to a hash of hashes" irgend wie hinbekomme. Gruß erselbst
Datum: 17.12.2005-17:50

|
re: Mehrere Hashes...
|
Seitenanfang |
| Ich hab es :-) Die HTML-Tabelle baue ich mir drumm herum. Wenn Du eine einfachere, besere Lösung weiss - immer her damit. #!/usr/bin/perlwhile (<DATA>) { my ($username, $hostname, $rights) = split(/\|/, $_); if (defined $HASH{$username}) { $HASH{$username}="$HASH{$username}:$hostname"; } else { $HASH{$username}=$hostname; } if (defined $SUBHASH{$username}{$hostname}) { $SUBHASH{$username}{$hostname}="$SUBHASH{$username}{$hostname}:$rights"; } else { $SUBHASH{$username}{$hostname}=$rights; } } foreach my $keys(sort (keys %HASH)) { print $keys."\n"; foreach my $sub( split(/:/, $HASH{$keys}) ) { print "\t".$sub."\n"; foreach my $subsub( split(/\s*,\s*/, $SUBHASH{$keys}{$sub}) ) { print "\t\t".$subsub."\n"; } } } __DATA__ mschulz|lina|sysadm,sysop,smbadm mschulz|lara|sysadm mschulz|xenia|sysadm,sysop,oracle,mysql sysadm|lina|sysadm sysadm|lara|sysadm sysadm|xenia|sysadm
Gruß erslebst
Datum: 18.12.2005-16:08

|
re: Mehrere Hashes...
|
Seitenanfang |
Hi, sieht schon recht gut aus. Hier meine Version (schon mit dem HTML):
#!/usr/bin/perl -wuse strict; my %HASH; while (<DATA>) { chomp; my ( $username, $hostname, $rights ) = split( /\|/, $_ ); $HASH{$username}{$hostname} = [ split(/,/, $rights) ]; } print '<table border=0>'; foreach my $user ( sort ( keys %HASH ) ) { my $seen_user; foreach my $host (keys %{$HASH{$user}} ) { print "\n<tr>\n"; printf "\t<td>%s</td>\n\t<td>%s</td>\n", ($seen_user++)?'nbsp;':$user, $host; print "\t<td>", join("<br>", @{$HASH{$user}{$host}}), "</td>\n</tr>"; } } print '</table>'; __DATA__ mschulz|lina|sysadm,sysop,smbadm mschulz|lara|sysadm mschulz|xenia|sysadm,sysop,oracle,mysql sysadm|lina|sysadm sysadm|lara|sysadm sysadm|xenia|sysadm
Gruss, svenXY
Datum: 19.12.2005-10:35

|
re: Mehrere Hashes...
|
Seitenanfang |
noch ein wenig verbessert:
#!/usr/bin/perl -wuse strict; my %HASH; while (<DATA>) { chomp; my ( $username, $hostname, $rights ) = split( /\|/, $_ ); $HASH{$username}{$hostname} = [ split(/,/, $rights) ]; } print '<table border=1>', "\n"; print '<tr><th>User</th><th>Host</th><th>Role</th></tr>', "\n"; foreach my $user ( sort ( keys %HASH ) ) { my $seen_user; foreach my $host (keys %{$HASH{$user}} ) { print "\n<tr valign=top>\n"; printf "\t<td>%s</td>\n\t<td>%s</td>\n", ($seen_user++)?' ':$user, $host; print "\t<td>", join("<br>", @{$HASH{$user}{$host}}), "</td>\n</tr>"; } } print '</table>'; __DATA__ mschulz|lina|sysadm,sysop,smbadm mschulz|lara|sysadm mschulz|xenia|sysadm,sysop,oracle,mysql sysadm|lina|sysadm sysadm|lara|sysadm sysadm|xenia|sysadm
Datum: 19.12.2005-11:11

|
re: Mehrere Hashes...
|
Seitenanfang |
| Das ist gut, so werde ich es machen. Die dritte Schleife in meiner Version hätte ich ja auch mit join lösen können. Naja, ich gehe immer über Moskau nach Paris :-) Vielen Dank... Gruß erselbst
Datum: 19.12.2005-21:56

|
|

|

|

|
 |

|

|
|