Как использовать местное время Perl с печатью, чтобы получить метку времени? - PullRequest
23 голосов
/ 07 апреля 2010

Я использовал следующие операторы для получения текущего времени.

  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

Первые два оператора не печатают текущее время в формате даты. Третье утверждение дает только правильный вывод в формате даты.

Насколько я понимаю, первый возвращает значение в скалярном контексте, поэтому он возвращает числа.

Затем во втором выпуске я использовал местное время только в контексте списка, почему он также дает вывод числа.

Ответы [ 5 ]

31 голосов
/ 07 апреля 2010

Пожалуй, самая важная вещь, которую вы можете выучить для программирования на 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";
10 голосов
/ 07 апреля 2010

Возвращаемое значение 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;
7 голосов
/ 07 апреля 2010

скаляр форсирует скалярный контекст:

print scalar localtime ();

Во втором примере это явно контекст списка, поэтому вы просто получаете распечатку чисел подряд. Например, попробуйте

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

и вы увидите числа, соединенные двоеточием.

4 голосов
/ 07 апреля 2010

И первое, и второе возвращают значения в контексте списка, но они, вероятно, не соответствуют вашим ожиданиям. Использование паренов по местному времени просто не поможет. Но вы можете использовать следующий код, чтобы получить эти возвращенные элементы списка отдельно:

@list = ($sec,$min,$hour,$day,$mon,$year_1900,$wday,$yday,$isdst)=localtime;
print join("\n",@list);
0 голосов
/ 06 сентября 2013

Если вы хотите получить метку текущего времени, Вы можете просто использовать функцию time ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...