2010-04-07 7 views
23

J'ai utilisé les instructions suivantes pour obtenir l'heure actuelle.Comment utiliser localtime de Perl avec print pour obtenir l'horodatage?

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

Sortie

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

Les deux premières déclarations ne sont pas l'impression de l'heure dans un format de date. Troisième instruction indiquant uniquement la sortie correcte dans un format de date. Ma compréhension est la première est de retourner une valeur dans un contexte scalaire, donc c'est le retour des nombres.

Ensuite, dans la deuxième impression, j'ai utilisé localtime dans le contexte de la liste uniquement, et pourquoi cela donne aussi une sortie numérique.

Répondre

30

Peut-être la chose la plus importante que vous pouvez apprendre la programmation en Perl, est le contexte. De nombreux sous-programmes et opérateurs intégrés se comportent différemment selon le contexte.

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 

Cela peut être rendu plus clair en fractionnant les instructions.

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 forces contexte scalaire:

print scalar localtime(); 

Dans le second exemple, il est clairement un contexte de liste de sorte que vous êtes juste une impression des numéros dans une rangée. Par exemple, essayez

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

et vous verrez les nombres joints avec un deux-points.

4

La première et la seconde renvoient les valeurs dans le contexte de la liste, mais elles ne sont probablement pas ce que vous attendez. L'utilisation de parens autour de localtime ne fera tout simplement rien d'utile. Mais vous pouvez utiliser le code suivant pour obtenir ces éléments de liste retournés séparément:

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

La valeur de retour de localtime dépend du contexte. Dans un contexte de liste est une liste de 9 éléments, alors que dans un contexte scalaire est une valeur 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" 

Maintenant, print fournit un contexte de liste pour ses arguments. C'est pourquoi print localtime sort les numéros de la liste (sans séparateur par défaut). Vous pouvez forcer un contexte scalaire sur localtime en utilisant soit l'opérateur de concaténation . (comme dans votre 3ème déclaration) ou en utilisant scalar:

print "".localtime; 
print scalar localtime; 
0

Si vous voulez obtenir l'horodatage de l'heure actuelle, vous pouvez simplement utiliser le temps de fonction()