2010-04-07 6 views
23

Ho usato le seguenti istruzioni per ottenere l'ora corrente.Come utilizzare la localtime di Perl con print per ottenere il timestamp?

print "$query executed successfully at ",localtime; 
    print "$query executed successfully at ",(localtime); 
    print "$query executed successfully at ".(localtime); 

uscita

executed successfully at 355516731103960 
executed successfully at 355516731103960 
executed successfully at Wed Apr 7 16:55:35 2010 

Le prime due istruzioni non vengono stampati l'ora corrente in un formato di data. Terza affermazione che fornisce solo l'output corretto in un formato data.

La mia comprensione è che il primo restituisce un valore nel contesto scalare, quindi restituisce i numeri.

Quindi nella seconda stampa ho utilizzato localtime solo nel contesto dell'elenco, perché fornisce anche l'output del numero.

risposta

30

Forse la cosa più importante che si può imparare per la programmazione in Perl, è contesto. Molte subroutine e operatori incorporati si comportano in modo diverso a seconda del contesto.

print "$query executed successfully at ", localtime, "\n"; # list context 
print "$query executed successfully at ",(localtime),"\n"; # list context 
print "$query executed successfully at ". localtime, "\n"; # scalar context 
print "$query executed successfully at ".(localtime),"\n"; # scalar context 

print "$query executed successfully at ", scalar localtime, "\n"; # scalar context 
print "$query executed successfully at ", scalar (localtime),"\n"; # scalar context 

Questo può essere reso più chiaro dividendo le dichiarazioni.

my $time = localtime; # scalar context 
print "$query executed successfully at $time\n"; 

my @time = localtime; # list context 
print "$query executed successfully at @time\n"; 
7

scalar forze contesto scalare:

print scalar localtime(); 

Nel secondo esempio, è chiaramente un contesto di lista in modo che stai ricevendo solo una stampa dei numeri di fila. Ad esempio, provare

print join (":", (localtime)); 

e vedrete i numeri uniti con i due punti.

4

Sia il primo che il secondo restituiscono i valori nel contesto dell'elenco ma probabilmente non sono quelli che ci si aspetterebbe. L'uso di parens in tempo reale non farà nulla di utile. Ma è possibile utilizzare il seguente codice per ottenere quelle voci di elenco restituiti separatamente:

@list = ($sec,$min,$hour,$day,$mon,$year_1900,$wday,$yday,$isdst)=localtime; 
print join("\n",@list); 
10

Il valore di ritorno di localtime dipende dal contesto. In un contesto di lista si tratta di una lista di 9 elementi, mentre in un contesto scalare è un valore ctime(3):

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime; 
my $now_string = localtime; # e.g., "Thu Oct 13 04:54:34 1994" 

Ora, print fornisce un contesto di lista per i suoi argomenti. Ecco perché print localtime emette i numeri dall'elenco (senza alcun separatore per impostazione predefinita). È possibile forzare un contesto scalare su localtime utilizzando l'operatore di . concatenazione (come nella vostra terza economico) o utilizzando scalar:

print "".localtime; 
print scalar localtime; 
0

Se si desidera ottenere il timestamp del tempo corrente, si può semplicemente usare il tempo function()

Problemi correlati