strftime (), согласно cpan.org:
print strftime($template, @lt);
Я просто не могу изобразить правильный рецепт кода Perl для этого. Это продолжает сообщать об ошибке, где я называю strftime ():
...
use Date::Format;
...
sub parse_date {
if ($_[0]) {
$_[0] =~ /(\d{4})/;
my $y = $1;
$_[0] =~ s/\d{4}//;
$_[0] =~ /(\d\d)\D(\d\d)/;
return [$2,$1,$y];
}
return [7,7,2010];
}
foreach my $groupnode ($groupnodes->get_nodelist) {
my $groupname = $xp->find('name/text()', $groupnode);
my $entrynodes = $xp->find('entry', $groupnode);
for my $entrynode ($entrynodes->get_nodelist) {
...
my $date_added = parse_date($xp->find('date_added/text()', $entrynode));
...
$groups{$groupname}{$entryname} = {...,'date_added'=>$date_added,...};
...
}
}
...
my $imday = $maxmonth <= 12 ? 0 : 1;
...
while (my ($groupname, $entries) = each %groups) {
...
while (my ($entryname, $details) = each %$entries) {
...
my $d = @{$details->{'date_added'}};
$writer->dataElement("creation", strftime($date_template, (0,0,12,@$d[0^$imday],@$d[1^$imday]-1,@$d[2],0,0,0)));
}
...
}
...
Если я использую () для передачи нужного массива strftime (), я добираюсь: Тип аргумента 2 до настоящего времени:: Формат:: strftime должен быть массивом (не, перечисляют) в./blah.pl строке 87, рядом"))"
Если я использую [] для передачи нужного массива, я добираюсь: Тип аргумента 2 до настоящего времени:: Формат:: strftime должен быть массивом (не анонимный список ([])) в./blah.pl строке 87, рядом"])"
Как я могу передать массив на лету sub в Perl? Это может легко быть сделано с PHP, Python, JS, и т.д. Но я просто не могу изобразить его с Perl.
Править: Я уменьшил код до этих немногих строк, и я все еще получил ту же самую проблему:
#!/usr/bin/perl
use warnings;
use strict;
use Date::Format;
my @d = [7,13,2010];
my $imday = 1;
print strftime( q"%Y-%m-%dT12:00:00", (0,0,12,$d[0^$imday],$d[1^$imday]-1,$d[2],0,0,0));
Если требуется массив и у вас есть специальный список, вам нужно фактически создать массив. Это не обязательно должна быть отдельная переменная, вы можете просто:
strftime(
$date_template,
@{ [0,0,12,$d[0^$imday],$d[1^$imday],$d[2],0,0,0] }
);
Я понятия не имею, почему Date :: Format может подвергнуть вас этой уродливости, а не просто ожидать нескольких скалярных параметров; кажется бессмысленным (и вопреки тому, как другие модули реализуют strftime). Грэм Барр обычно разрабатывает интерфейсы лучше, чем этот. Может быть, это началось с того времени, когда прототипы все еще казались классной идеей для общих целей.
Чтобы использовать список как анонимный массив, скажем, для интерполяции строк, вы можете написать
print "@{[1, 2, 3]}\n";
to get
1 2 3
Эта же техника обеспечивает обходной путь для забавного прототипа Date::Format::strftime
:
print strftime(q"%Y-%m-%dT12:00:00",
@{[0,0,12,$d[0^$imday],$d[1^$imday]-1,$d[2],0,0,0]});
Output:
1900-24709920-00T12:00:00
Обычно массивы легко передавать подпрограммам Perl "на лету". Но Date::Format::strftime
- это особый случай со специальным прототипом ($\@;$)
, который не допускает аргументов "список" или "присвоение списка":
strftime($format, (0,0,12,13,7-1,2010-1900)); # not ok
strftime($format, @a=(0,0,12,13,7-1,2010-1900)); # not ok
Обходной путь заключается в том, что вы должны вызвать strftime
с переменной массива.
my @time = (0,0,12,13,7-1,2010-1900); # note: @array = ( ... ), not [ ... ]
strftime($format, @time);
Я посмотрел еще раз и увидел настоящую проблему в этом коде:
my $d = @{$details->{'date_added'}};
$writer->dataElement("creation", strftime($date_template, (0,0,12,@$d[0^$imday],@$d[1^$imday]-1,@$d[2],0,0,0)));
В частности, @ {$ details -> {'date_added'}}
является разыменованием. Но вы назначаете его скалярной переменной, и вам не нужно разыменовывать строку под ней:
my @d = @{$details->{'date_added'}};
$writer->dataElement("creation", strftime($date_template, (0,0,12,$d[0^$imday],$d[1^$imday]-1,$d[2],0,0,0)));
Я создал обычный массив для вашей ссылки @d
и просто получил к нему доступ как обычный массив ( $ d [...]
вместо @ $ d [...]
)