Как использовать Perl localtime с печатью, чтобы получить метку времени?
Я использовал следующие инструкции для получения текущего времени.
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 только в контексте списка, почему он также дает вывод номера.
Ответы
Ответ 1
Возможно, самое важное, что вы можете узнать для программирования в 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";
Ответ 2
Возвращаемое значение 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;
Ответ 3
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);
Ответ 5
Если вы хотите получить временную метку текущего времени,
вы можете просто использовать функцию time()