有很多脚本——实际上这家店所有使用日期的Perl脚本——都使用这种结构。它在backticks中使用date命令。这真的很糟糕吗?它是打开了一个地下室还是什么的,或者只是不是“伪善的”。是否值得我检查SVN中的所有脚本并将其更改为localtime?

#!/usr/bin/perl
chomp($date=`date '+%Y%m%d'`);
if (@ARGV) {
   $date = $ARGV[0] ;
}

最佳答案

至少,只有在需要时才调用shell:

if (@ARGV) {
   $date = $ARGV[0] ;
}
else {
    chomp($date=`date '+%Y%m%d'`);
}

只调用shell来丢弃结果的效率要低得多。
但是您可以用纯Perl以多种方式生成输出。Time::Piece模块是一个Perl核心模块,这意味着它始终存在,或者您可以从提供它的模块之一使用strftime
$ perl -MTime::Piece -le '$t = new Time::Piece; print $t->ymd("");'
20150106
$ perl -MTime::Piece -le '$t = localtime; print $t->ymd("");'
20150106
$ perl -MTime::Piece -le '$t = localtime; print $t->strftime("%Y%m%d")'
20150106
$ perl -MPOSIX -le 'print strftime("%Y%m%d", localtime(time))'
20150106
$

因此,在上下文中,假设在文件的顶部添加use Time::Piece;,则可以编写:
use Time::Piece;

…

if (@ARGV) {
   $date = $ARGV[0] ;
}
else {
    my $t = localtime;
    $date = $t->ymd("");
}

除非需要,否则不会计算默认日期。

关于bash - 在反引号中使用date命令进行perl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27792681/

10-15 00:03
查看更多