我有一个名为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
.....请帮助
答案 0 :(得分:3)
您使用$ENV{"startDate"}
从Perl访问环境变量。
但是,以$ARGV[0]
传递它可能更有用。
startDate=2013-02-25
perl -MUtil -e 'print Util::getNextDate($ARGV[0]);' "$startDate" |
tee "$result"
答案 1 :(得分: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
答案 2 :(得分:1)
正如我在那里告诉你的那样,它不是perl而是ksh问题,你在调用Perl时会在引号错误,swap'和“中得到变量插值。
startDate='2013-02-25';
perl -MUtil -e "print Util::getNextDate('$startDate');"
目前,您只是将变量名称作为字符串传递。