strftime(),根据cpan.org:
print strftime($template, @lt);
Run Code Online (Sandbox Code Playgroud)
我只是想不出这个正确的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)));
}
...
}
...
Run Code Online (Sandbox Code Playgroud)
如果我使用()通过strftime()传递所需的数组,我得到:arg 2到Date :: Format :: strftime的类型必须是./blah.pl第87行的数组(不是列表),靠近")) "
如果我使用[]传递所需的数组,我得到:arg 2到Date :: Format :: strftime的类型必须是数组(不是匿名列表([]))在./blah.pl第87行,靠近"] )"
如何将数组动态传递给Perl中的sub?这可以通过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));
Run Code Online (Sandbox Code Playgroud)
如果需要数组并且您有一个临时列表,则需要实际创建一个数组.它不需要是一个单独的变量,你可以这样做:
strftime(
$date_template,
@{ [0,0,12,$d[0^$imday],$d[1^$imday],$d[2],0,0,0] }
);
Run Code Online (Sandbox Code Playgroud)
我不知道为什么Date :: Format会让你受到这种可怕的影响,而不仅仅是期望多个标量参数; 似乎毫无意义(与其他模块如何实现strftime相反).Graham Barr通常设计出比这更好的接口.也许它可以追溯到原型仍然是一般用途的酷想法.