2016-08-16 6 views
0

Ich habe ein anständig funktionierendes Skript bekommen, und bin glücklich mit seinen Ergebnissen, größtenteils dank der Informationen, die ich hier gefunden habe.Perl - Wie man einen Aktualisierungszeitstempel generiert

Eine Sache, die ich nicht richtig scheinen kann, ist der Zeitstempel. Derzeit bin ich dieses

use POSIX qw/strftime/; 
my $timestamp = strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime); 

verwendet, die gut funktioniert, mit der Ausnahme, dass, wenn ich $ Zeitstempel nennen, wird es immer der gleiche Zeitstempel für alle Teile des Codes (überhaupt nicht aktualisieren).

ich versucht, dies mit einem Unterprogramm zu beseitigen (was ich noch nie zuvor getan haben):

sub GetLoggingTime { 
    use POSIX qw/strftime/; 
    my $LoggingTime = strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime); 
    return $LoggingTime; 
} 

my $timestamp = GetLoggingTime(); 

print "$timestamp \n"; 
sleep(2); 
print "$timestamp \n"; 

offensichtlich die beiden Drucke und der Schlaf sind, um zu versuchen und sehen, ob es „Aktualisierung“ ist, was es ist nicht. Beide Zeitstempel werden mit der gleichen Zeit gedruckt.

Ich versuchte dann, die Subroutine direkt aufzurufen, einen Ausdruck innerhalb der Unterroutine hinzuzufügen und ihn mit & GetLoggingTime aufzurufen, aber das tat gar nichts (keine Ausgabe).

Ich weiß, ich vermisse wahrscheinlich etwas offensichtlich, aber ich kann es einfach nicht finden. Gibt es einen einfachen Weg, um dies zum Laufen zu bringen, oder gibt es eine einfache Möglichkeit, einen Zeitstempel zu erhalten, der sich im Laufe des Skripts in Echtzeit aktualisiert?

Vielen Dank im Voraus!

+3

Sie müssen Ihr Unterprogramm erneut aufrufen, damit der Wert aktualisiert wird :) – squiguy

Antwort

5

Sie müssen die Anweisung use nicht in Ihre Subroutine einfügen, die an der Spitze Ihres Programms stehen kann.

Ihr Code:

my $timestamp = GetLoggingTime(); 

print "$timestamp \n"; 
sleep(2); 
print "$timestamp \n"; 

ruft GetLoggingTime() und speichert die Ausgabe innerhalb $timestamp. Dies bedeutet, dass der Wert innerhalb von $timestamp statisch bleibt. Wenn Sie die Ausgabe der heutigen Zeit jeder Zeit erhalten möchten, müssen Sie GetLoggingTime() jedes Mal, wenn Sie einen aktualisierten Wert aufrufen müssen:

my $timestamp = GetLoggingTime(); 
print "$timestamp \n"; 
sleep(2); 
$timestamp = GetLoggingTime(); 
print "$timestamp \n"; 

Sie vermeiden können eine Variable durch das Ergebnis der GetLoggingTime() direkt verketten zu Ihrem Strings:

print GetLoggingTime() . " \n"; 
sleep(2); 
print GetLoggingTime() . " \n"; 

oder wenn Ihr Zeitstempel immer einen Raum und newline benötigen, können Sie beinhalten, dass innerhalb GetLoggingTime()

sub GetLoggingTime { 
    return strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime) . " \n"; 
} 
+0

Ah, danke Drav - das war genau das, wonach ich suchte! Ich habe nicht bemerkt, dass du direkt ein Unterprogramm drucken kannst! Ich würde annehmen, dass ich das innerhalb einer anderen print-Anweisung aufrufen kann, wenn es für die Platzierung über eine weitere Verkettung benötigt wird (zB muss nicht der erste Teil der Druckzeichenfolge funktionieren). Sehr dankbar für die Unterstützung! – Kittamaru

+0

Absolut korrekt, GetLoggingTime() gibt einen "Skalar" zurück, der eine Zeichenkette enthält, die Sie beliebig mit einer anderen Zeichenkette verketten können. –

0

Sie können erreichen, was Sie wollen mit tied variables. Aber beachte, dass es sich um eine eher esoterische Ecke von Perl handelt und die Verwendung dieses Programms dein Programm verlangsamen wird.

Ich wollte demonstrieren, indem ich ein einfaches Zeitstempelbeispiel schrieb. Aber es scheint, dass Tie::Scalar::Timestamp bereits existiert.

Verwandte Themen