Thread Zufallsfunktion im Script
(12 answers)
Opened by Compined at 2011-10-11 00:18
Hallo,
ich hatte gerade Lust, das als Fingerübung umzusetzen. Wie von Linuxer vorgeschlagen wird das heutige Zitat (denn ich nehme an, es handelt sich um eine Zitat-des-Tages-Anwendung) in einer Datei zwischengespeichert. Zugleich werden die Zitate der letzten n Tage zwischengespeichert, um sicherzustellen, dass sich ein Zitat nicht nach allzu wenigen Tagen wiederholt. Code (perl): (dl
)
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 #!/usr/bin/perl use strict; use warnings; # config my $sourceFile = 'zitate.txt'; # Datei mit den Zitaten (zeilenweise getrennt) my $archivFile = $0 . '_archiv.txt'; # Datei mit den letzten $minDiffTage Tagen (wird ggf. erzeugt) my $minDiffTage = 7; # Muss sein < Anzahl der unterschiedlichen Einträge im SourceFile #/config my ($mday,$mon,$year) = (localtime())[3,4,5]; my $heute = sprintf('%04d%02d%02d',$year+1900,$mon+1,$mday); my $zitatDesTages; my %archiv = leseArchiv($archivFile); if ($archiv{$heute}) { $zitatDesTages = $archiv{$heute}; } else { my %zitate = reverse %archiv; do { $zitatDesTages = zufallsEintrag($sourceFile); } while ($zitate{$zitatDesTages}); schreibeArchiv($archivFile, $minDiffTage, $heute, $zitatDesTages, %archiv); } print $zitatDesTages; ############################################################################### sub leseArchiv { my $archivFile = shift; open my $archivFH, "<", $archivFile or return; my %archiv; while (my $row = <$archivFH>) { my ($key, $value) = ($row =~ m/^(\d{8})\t(.+)/); $archiv{$key} = $value; } close $archivFH; return %archiv; } sub schreibeArchiv { my ($archivFile, $minDiffTage, $heute, $zitatDesTages, %archiv) = @_; open my $archivFH, ">", $archivFile or die $!; print $archivFH "$heute\t$zitatDesTages"; for my $key ((sort {$b <=> $a} keys %archiv)[0..$minDiffTage-2]) { print $archivFH "\n$key\t$archiv{$key}" if $key; } close $archivFH; } sub zufallsEintrag { $sourceFile = shift; open my $sourceFH, "<", $sourceFile; my @lines = <$sourceFH>; close ($sourceFH); chomp (@lines); my $zitat; $zitat = $lines[ rand (scalar @lines) ] until $zitat; # Leerzeilen ignorieren return $zitat; } Danke im Voraus für Kommentare, Grüße payx Editiert von payx: sprintf in Zeile 12, für korrektes Datumsformat Last edited: 2011-10-12 14:15:04 +0200 (CEST) |