2010-04-07 88 views
23

我已使用以下语句获取当前时间。如何在打印中使用Perl的本地时间获取时间戳?

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

输出

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

前两个语句不打印日期格式的当前时间。 仅以日期格式提供正确输出的第三条陈述。

我的理解是第一个在标量上下文中返回值,所以它返回数字。

然后在第二个打印中,我只在列表上下文中使用localtime,为什么它也给出了数字输出。

回答

30

也许你可以在Perl学习编程的最重要的事情,是上下文。许多内置子程序和操作符的行为因环境而异。

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 

通过分解陈述可以使这更清晰。

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力量标量上下文:

print scalar localtime(); 

在第二个例子中,它显然是一个列表上下文所以你刚刚起步的号码打印成一排。例如,尝试使用

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

然后您会看到用冒号连接的数字。

4

第一个和第二个都返回列表上下文中的值,但它们可能不是您所期望的。在当地时间周围使用parens根本不会做任何有用的事情。但是你可以使用下面的代码分别获得那些返回列表项:

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

localtime返回值取决于上下文。在列表上下文它是9-元素的列表,而在标量上下文它是一个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" 

现在,print提供列表环境为它的参数。这就是为什么print localtime输出列表中的数字(默认情况下没有任何分隔符)。您可以使用该.连接符(如在你的第三个语句),或使用scalar强行localtime标量上下文:

print "".localtime; 
print scalar localtime; 
0

如果你想获得的当前时间, 你可以使用函数time()的时间戳