random-link ohne Zufallsprinzip
Andreas
- perl
Hallo,
das nachfolgende Script gibt einen Zufallslink aus. Dabei gibt es keine bestimmte Reihenfolge. Wie muß das Script umgeschrieben werden, damit die
URL-Adressen, die in der Datei Url.txt stehen, der Reihe nach ausgewählt werden. Also bei jedem Aufruf des Script wird die nächste URL der Reihe nach
ausgegeben und nicht durch Zufall ausgewählt.
Am Ende von Url.txt soll das script von vorne beginnen.
Ich hoffe jemand kann mir helfen. Meine cgi-Kenntnisse sind dafür leider nicht ausreichend. Oder gibt es so ein Script bereits? Was ich bisher an scripten im Netz
gefunden habe, arbeitet nach dem Zufallsprinzip.
#!/usr/bin/perl
######################################################################
$RandomLinkFile = "/Absolute/path/to/Url.txt";
$UseLog = 1; # Use Log File ? 1 = YES; 0 = NO
$RandomLogFile = "/Absolute/path/to/Log.txt";
######################################################################
srand(time);
open(LINKS,"$RandomLinkFile") || &Error("Cannot Open Links File : $RandomLinkFile, Error $!\n");
$NbLines = @LinkFile = ;
close(LINKS);
$Url = $LinkFile[int rand $NbLines];
if ($UseLog) {
@date = localtime(time); $date[4]++; $date[5] += 1900;
$Time = "$date[4]/$date[3]/$date[5]";
open(LOG,">>$RandomLogFile") || &Error("Cannot Write Log File : $RandomLogFile, Error $!\n");
print LOG "[$Time] - $ENV{'REMOTE_HOST'} -> $Url\n";
close(LOG);
}
print "Location: $Url\n\n";
sub Error {
my($ErrorText) = @_;
print "Content-type: text/html\n\n";
print "Error: ".$ErrorText;
exit;
}
Gruß Andreas
Hi,
Also bei jedem Aufruf des Script wird die nächste URL der Reihe nach
ausgegeben und nicht durch Zufall ausgewählt.
Du musst die letzte bzw. nächste URL (bzw. dessen Nummer) irgendwie abspeichern.
Meine cgi-Kenntnisse sind dafür leider nicht ausreichend.
CGI-Kenntnisse brauchst Du hierfür kaum. Perl-Kenntnisse reichen aus.
#!/usr/bin/perl
#!/usr/bin/perl -w
use strict;
Anschließend die Fehler des Scripts korrigieren, die Dir gemeldet werden.
$RandomLinkFile = "/Absolute/path/to/Url.txt";
perldoc -f my
perldoc perlstyle (Schreibweise von Variablennamen)
perldoc perlfaq4 (What's wrong with always quoting "$vars"? - Allgemein wann immer möglich Singlequotes verwenden.)
srand(time);
perldoc -f srand (zweiter Absatz)
$NbLines = @LinkFile = ;
Was?
sub Error {
my($ErrorText) = @_;
perldoc -f shift
Cheatah
Hi Cheatah,
sub Error {
my($ErrorText) = @_;
perldoc -f shift
Stilfrage: Was genau gefällt Dir an "shift" besser als an der Zuweisung?
Wenn ich 10 Parameter habe, kann ich die in _einer_ "my(...)=@_"-
Zuweisung versorgen ... was nützt mir "shift" in diesem Zusammenhang?
(Außer daß es @_ zerstört, was ich gar nicht vor hatte?)
Viele Grüße
Michael
Hi,
my($ErrorText) = @_;
perldoc -f shift
Stilfrage: Was genau gefällt Dir an "shift" besser als an der Zuweisung?
wenn hier mehr als ein Parameter übergeben wird, würde der Rest ins Nirvana gefüllt werden. Wenn Du bei mehreren Parametern mittels z.B.
my ($var1, $var2, $var3) = @_;
die Werte füllst, jedoch weniger übergeben wurden als erwartet, ist der Rest undefined.
Wenn ich 10 Parameter habe, kann ich die in _einer_ "my(...)=@_"-
Zuweisung versorgen ... was nützt mir "shift" in diesem Zusammenhang?
my ($var1, $var2, $var3) = (shift||42, shift||'test', shift||&blablub);
(Außer daß es @_ zerstört, was ich gar nicht vor hatte?)
Wozu brauchst Du @_ noch, nachdem Du dessen Inhalt in Variablen gerettet hast? In den paar Fällen, wo das wirklich sinnvoll ist, kopierst Du es halt erst in ein lokales Array. Bedenke übrigens auch, dass eine magische Variable wie @_ evtl. nicht _nur_ durch den Funktionsaufruf gefüllt wird - später in der Funktion können die Werte durch etwas anderes überschrieben werden.
Cheatah
Hoi,
zusaetzlich zu Cheatahs Anmerkungen noch:
print "Location: $Url\n\n";
Hier fehlt der richtige Status. Opera folgt der URL nicht ohne den
richtigen Status. Deshalb:
print "Status: 302 Moved Temporarily\015\012",
"Location: $Url\015\012\015\012";
Gruesse,
CK