0

我有一个名为 Util 的 .pm 文件。和一个返回下一个日期的子程序。

sub getNextDate { 
    $inputDate = @_[1]; 
    if ($inputDate != "") { 
        ($year,$mon,$day) = split("-",$inputDate); 
        $mon = $mon - 1; 
        $dtToday = timelocal(0,0,0,$day,$mon,$year); 
    } else { 
        $dtToday = time; 
    } 
    $nextDate = $dtToday + 86400; 
    $nextMonth = ( localtime( $nextDate)->mon ) + 1; 
    $nextYear = ( localtime( $nextDate)->year ) + 1900; 
    $nextDay = localtime( $nextDate)->mday;
    if($nextMonth <= 9) { 
        $nextMonth = '0'.$nextMonth; 
    }
    if($nextDay <= 9) { $nextDay = '0'.$nextDay ; }
    return $nextYear . "-" . $nextMonth . "-" . $nextDay; 
}

我有一个 .ksh 文件。我想将日期作为参数从 .ksh 文件传递​​给 .pm 中的子例程。

我在 .ksh 中的代码是

startDate=2013-02-25 perl -MUtil -e 'print Util::getNextDate("$startDate");' > $result
echo $result

它不工作..我根据当前日期而不是我通过的日期获得输出..

如果我直接保存日期而不是变量,我会得到正确的输出。perl -MUtil -e 'print Util::getNextDate("2013-02-25");'

但我想用$startDate而不是2013-02-25.....请帮助

4

3 回答 3

3

您用于$ENV{"startDate"}从 Perl 访问环境变量。

不过,也许将其传递为 as 会更有用$ARGV[0]

startDate=2013-02-25
perl -MUtil -e 'print Util::getNextDate($ARGV[0]);' "$startDate" |
tee "$result"
于 2013-10-20T09:37:55.097 回答
2

您应该Time::Piece用于此目的。自 9.5 版以来,它一直是 Perl 的核心模块,因此不需要安装。

use strict;
use warnings;

use Time::Piece;
use Time::Seconds 'ONE_DAY';

sub getNextDate {
  my $date = @_ ? Time::Piece->strptime($_[0], '%Y-%m-%d') : localtime;
  return ($date + ONE_DAY)->strftime('%Y-%m-%d');
}

print getNextDate('2012-12-31'), "\n";
print getNextDate, "\n";

输出

2013-01-01
2013-10-21
于 2013-10-20T13:19:52.793 回答
1

这是交叉发布到 perlmonks

正如我在那里告诉你的那样,这不是 perl 而是 ksh 问题,在调用 Perl 时,引号中的变量插值是错误的,交换 ' 和 "。

startDate='2013-02-25'; 
perl -MUtil -e "print Util::getNextDate('$startDate');"

目前,您只是将变量名称作为字符串传递。

于 2013-10-20T13:24:31.017 回答