Perl - сохранить вывод локального времени в хеш

В perl я могу получить текущие секунды, используя эту последовательность команд:

my @time = ($sec,$min,$hour,$day,$mon,$year_1900,$wday,$yday,$isdst)=localtime;
print $time[0]

Есть ли аналог этого, но с использованием хэшей? Таким образом, можно ввести что-то вроде этого:

print $time{"sec"} 

Я пытался:

my %time= ("sec","min","hour","day","mon","year_1900","wday","yday","isdst")=localtime;
print $time{"sec"}

Но это закончилось следующей ошибкой:

Can't modify constant item in list assignment at -e line 1, near "localtime;"
Execution of -e aborted due to compilation errors.

Спасибо


person Wakan Tanka    schedule 19.03.2014    source источник


Ответы (3)


Вы можете использовать срез хеша

my %time;
@time{"sec","min","hour","day","mon","year_1900","wday","yday","isdst"} = localtime;
# or shorter
# @time{qw(sec min hour day mon year_1900 wday yday isdst)} = localtime;

print $time{"sec"};
person mpapec    schedule 19.03.2014
comment
Я предлагаю написать @time{qw(sec min hour day mon year_1990 wday yday isdst)}, чтобы сохранить все символы кавычек. - person Daniel Böhmer; 19.03.2014

Вместо того, чтобы хранить все в хеше, вы можете хранить это в объекте, используя Time::Piece:

#!/usr/bin/perl

use strict;
use warnings;

use Time::Piece;

my $t = localtime;
print $t->sec;

Time::Piece может выполнять математические операции с датами, сравнения, синтаксический анализ и вывод, что делает его более гибким, чем простой хэш.

person ThisSuitIsBlackNot    schedule 19.03.2014

Есть несколько стандартных модулей Perl, которые могут вам помочь.

Первый — Time::localtime. Он заменяет команду internal localtime методами по имени для доступа к различным частям времени:

use strict;           # Always
use warnings;         # Always
use feature qw(say);  # An improved version of the print command

use Time::localtime

my $time = localtime; # A Time::Tm object, not your standard localtime command

say $time->sec;       # Prints the seconds

Это не совсем тот хэш, который вы запросили, но вы можете видеть, что он значительно улучшает доступ к различным фрагментам, предоставляемым localtime, почти как хэш.

Вы также можете увидеть использование say, похожего на print, за исключением того, что вам не нужен этот надоедливый \n в конце (как вы забыли в своем примере).


Переходим к следующему шагу...

Другой хороший стандартный модуль называется Time::Piece. Он предоставляет еще более простые способы анализа времени и его отображения.

use strict;           # Always
use warnings;         # Always
use feature qw(say);  # An improved version of the print command

use Time::Piece

my $time =  localtime;
say $time->sec;       # Prints the seconds. Looks pretty much the same

#
# But now look!
#

say $time->ymd;       # Prints the time as YYYY-MM-DD
say $time->ymd("/");  # Prints the time as YYYY/MM/DD
say $time->mdy("/");  # Prints the time as MM/DD/YYYY
say $time->month;     # Prints the name of the month
say $time->cdate;     # Prints date and time as a string

Я предпочитаю Time::Piece из-за его гибкости и простоты инициализации даты, отличной от текущего времени. Если у вас есть строка для даты/времени, и вы можете ее описать, вы можете легко создать новый Time::Piece объект даты/времени, которым можно манипулировать.


Одна из многих вещей, которые упускают из виду программисты Perl, — это изобилие стандартных модулей Perl, которые входят почти в каждый дистрибутив Perl. Эти модули не требуют загрузки или установки. Они есть и доступны практически на любом компьютере, на котором установлена ​​конкретная версия Perl.

Вы можете использовать File::Copy для этой отсутствующей команды копирования файла. Вы можете использовать File::Basename для этой отсутствующей команды basename и dirname. Вы можете использовать сотни модулей, поставляемых с Perl, чтобы облегчить себе жизнь. Ознакомьтесь со стандартной документацией Perl и поэкспериментируйте с ней.

person David W.    schedule 19.03.2014