#!/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; }