Я использовал следующие утверждения для получения текущего времени.
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 в контексте списка только, почему это также дает вывод числа.
Возможно, самое важное, чему вы можете научиться для программирования на 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";
scalar заставляет скалярный контекст:
print scalar localtime ();
Во втором примере это явно контекст списка, так что вы просто получаете распечатку чисел в строке. Например, попробуйте
print join (":", (localtime));
, и вы увидите числа, соединенные двоеточием.
Возвращаемое значение 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;
И первый, и второй возвращают значения в контексте списка, но они, вероятно, не такие, как вы ожидали. Использование скобок вокруг местного времени просто не принесет ничего полезного. Но вы можете использовать следующий код, чтобы получить эти возвращенные элементы списка отдельно:
@list = ($sec,$min,$hour,$day,$mon,$year_1900,$wday,$yday,$isdst)=localtime;
print join("\n",@list);