1 2 3 4 5 6 7
use List::Util qw(shuffle); my @a = (1,2,3,4,5,6); my @b = shuffle(@a); print $b[0];
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
#!/usr/bin/perl use strict; use warnings; my $file = 'lwall-quotes.txt'; # http://www.cpan.org/misc/lwall-quotes.txt.gz my $recSep = "%%$/"; # input record separator in dieser Datei print zufallsEintrag($file, $recSep); ############################################################################### sub zufallsEintrag { $file = shift; local $/ = (shift or $/); open my $txtFH, "<", $file or die $!; my $entryCnt; $entryCnt++ while <$txtFH>; my $selEntry = int(rand($entryCnt))+1; my $entry; seek $txtFH,0,0; # wieder an den Anfang $.=0; # wird mit seek nicht auf 0 zurückgesetzt while ($entry = <$txtFH>) { last if $. == $selEntry; } close $txtFH or die $!; chomp($entry); return $entry; }
1 2 3 4 5
$.=0; # wird mit seek nicht auf 0 zurückgesetzt while ($entry = <$txtFH>) { last if $. == $selEntry; }
1
2
3
4
5
6
7
8
9
10
11
12
open (LFILE, "<$file");
my $content=join('',<LFILE>);
close (LFILE);
chomp (@lines);
@contents = split(/\|/,$content);
$time=time;
($min,$hour,$mday,$mon,$year,$wday) = (localtime($time))[1,2,3,4,5,6];
$mon++;
if ($mday<10) { $mday = "0".$mday; }
chomp (@lines);
$contents[ rand @contents ]
srand(join("",(localtime())[3,4,5]));
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; }