2010-04-07 10 views
23

He utilizado las siguientes declaraciones para obtener la hora actual.¿Cómo uso el tiempo local de Perl con impresión para obtener la marca de tiempo?

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

salida

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

Las dos primeras afirmaciones no están imprimiendo la hora actual en un formato de fecha. Tercer extracto que solo da el resultado correcto en un formato de fecha.

Según tengo entendido, el primero devuelve un valor en contexto escalar, por lo que devuelve números.

Luego en la segunda impresión utilicé localtime solo en contexto de lista, por qué también está dando salida numérica.

Respuesta

30

Tal vez lo más importante que usted puede aprender para la programación en Perl, es el contexto. Muchas subrutinas y operadores incorporados se comportan de manera diferente según el contexto.

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 

Esto se puede aclarar dividiendo las declaraciones.

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 fuerzas contexto escalar:

print scalar localtime(); 

En el segundo ejemplo, es claramente un contexto de la lista por lo que acaba de entrar una copia impresa de los números en una fila. Por ejemplo, pruebe

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

y verá los números unidos con dos puntos.

4

Tanto la primera como la segunda devuelven los valores en el contexto de la lista, pero probablemente no sean las que cabría esperar. El uso de parens alrededor de localtime simplemente no hará nada útil. Sin embargo, se puede utilizar el siguiente código para obtener los elementos de la lista devueltos por separado:

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

El valor de retorno de localtime depende del contexto. En el contexto de lista es una lista de 9 elementos, mientras que en contexto escalar es un valor 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" 

Ahora, print proporciona contexto de la lista de sus argumentos. Es por eso que print localtime muestra los números de la lista (sin ningún separador por defecto). Puede forzar contexto escalar en localtime usando el operador de concatenación . (como en su tercera declaración) o el uso de scalar:

print "".localtime; 
print scalar localtime; 
0

Si desea obtener la marca de tiempo de la hora actual, sólo se puede utilizar el tiempo de la función()

Cuestiones relacionadas