Thread Zufallsfunktion im Script (12 answers)
Opened by Compined at 2011-10-11 00:18

payx
 2011-10-11 16:57
#153109 #153109
User since
2006-05-04
564 Artikel
BenutzerIn

user image
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)

View full thread Zufallsfunktion im Script