Как я использую localtime 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 в контексте списка только, почему это также дает вывод числа.

23
задан Eugene Yarmash 14 December 2015 в 22:24
поделиться

4 ответа

Возможно, самое важное, чему вы можете научиться для программирования на 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";
31
ответ дан 29 November 2019 в 01:30
поделиться

scalar заставляет скалярный контекст:

print scalar localtime ();

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

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

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

7
ответ дан 29 November 2019 в 01:30
поделиться

Возвращаемое значение 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 , используя либо . оператор конкатенации (как в вашем 3-м операторе) или использование скаляра :

print "".localtime;
print scalar localtime;
10
ответ дан 29 November 2019 в 01:30
поделиться

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

@list = ($sec,$min,$hour,$day,$mon,$year_1900,$wday,$yday,$isdst)=localtime;
print join("\n",@list);
4
ответ дан 29 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: