23

我使用以下语句来获取当前时间。

  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,为什么它也给出数字输出。

4

5 回答 5

31

也许你可以在 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";
于 2010-04-07T13:54:04.493 回答
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从列表中输出数字(默认情况下没有任何分隔符)。localtime您可以使用.连接运算符(如在第三条语句中)或使用强制标量上下文scalar

print "".localtime;
print scalar localtime;
于 2010-04-07T12:05:59.210 回答
7

标量强制标量上下文:

print scalar localtime ();

在第二个示例中,它显然是一个列表上下文,因此您只需打印出连续的数字。例如,尝试

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

你会看到用冒号连接的数字。

于 2010-04-07T11:32:43.817 回答
4

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

@list = ($sec,$min,$hour,$day,$mon,$year_1900,$wday,$yday,$isdst)=localtime;
print join("\n",@list);
于 2010-04-07T12:05:42.510 回答
0

如果要获取当前时间的时间戳,可以使用函数 time()

于 2013-09-06T07:31:21.177 回答