无法将参数从ksh脚本传递到.pm文件中的子例程

时间:2013-10-20 09:35:49

标签: perl

我有一个名为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 .....请帮助

3 个答案:

答案 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)

这是cross-posted to perlmonks

正如我在那里告诉你的那样,它不是perl而是ksh问题,你在调用Perl时会在引号错误,swap'和“中得到变量插值。

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

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