【问题标题】:Naming the file to current date将文件命名为当前日期
【发布时间】:2019-04-26 19:15:40
【问题描述】:

我对 perl 很陌生,我习惯了 C#

我每天多次解析多个 xml 文件以获取一些防病毒数据。 我正在尝试将文件命名为当月的当前日期,即 20190425。虽然它的名称相同,但它会附加到这个文件,如果它是新的一天,即 20190426,它会创建这个新文件并开始附加到那个

我正在考虑使用日志功能,我可以“自动”检查,因为它只会检查文件名是否存在。

open (LOG, '>> report.txt'); #追加到report.txt

我可以在这个名字上加上当前日期吗?所以它会是 比如说 20190425-Report.txt ?这样它会自动“明天”创建一个新文件并开始添加到它

使脚本名称与当前日期相同。

【问题讨论】:

    标签: perl logging


    【解决方案1】:

    Time::Piece 模块更改了标准的localtime() 函数,使其返回一个表示当前时间的对象。该对象有一个strftime() 方法,该方法会将该时间作为字符串返回,该字符串使用您传递给该方法的模板格式化。

    use feature 'say';
    use Time::Piece;
    
    my $now = localtime;
    
    say $now->strftime('%Y%m%d'); # %Y = year; %m = month; %d = date
    

    您可以像这样在代码中使用它:

    use feature 'say';
    use Time::Piece;
    
    my $now = localtime;
    
    my $today = $now->strftime('%Y%m%d');
    
    # Note: I've switched to the three-arg version of open()
    # and a lexical filehandle. Both are considered best practice.
    # I've also checked the return value from open() and killed
    # the program if it fails.
    open my $log_fh, '>>', "$today-Report.txt"
      or die "Cannot open $today-Report.txt: $!";
    

    更新:在您的后续回答中,您谈到尝试我的代码时出错。正如您所怀疑的,这些错误都源于您使用的 Perl 版本较旧。 Perl 5.6.0 于 2000 年 3 月发布,我应该指出,Perl 开发团队在很长一段时间内完全不支持它。 Perl 5.10.0(2007 年 12 月发布)中添加了给您带来问题的功能。我认为 5.10 版是用于合理的现代 Perl 开发环境的绝对最低版本。我强烈建议您升级到更新版本的 Perl。

    话虽如此,(当然)可以在您的旧版 Perl 中执行此操作。

    use POSIX 'strftime';
    
    my $today = strftime('%Y%m%d', localtime);
    print "Today is: $today\n";
    
    my $filename = "$today-Report.txt";
    
    # I'm not sure when modern file-opening practices
    # were added to Perl, so I've reverted to using a
    # really old syntax.
    open LOG, ">>$filename"
      or die "Cannot open $filename: $!";
    

    【讨论】:

    • 这是一个公平的答案,但你不需要Time::Piece:你可以只用use POSIX qw(strftime); 然后my $filename = strftime("%Y%m%d-Report.txt", localtime());
    • @TFBW:是的。但我更喜欢尽可能使用对象。
    • perl -MTime::Piece -wE'$today = (localtime)->ymd(""); say $today'。 @TFBW——我也更喜欢T::P::strftime 而不是 POSIX。 (一方面,事实证明实际上还有更多与日期有关的内容。)
    • 嘿,戴夫。我实际上确实尝试过更新到我相信它是 5.23 ?但它开始抛出错误。而且我在 Perl 方面的知识真的没什么好吹嘘的。但是,您的更新救了我,使用两个变量来存储日期,然后是日期+名称,并且编写它已经奏效。我同意,生产环境应该尽可能保持最新。但是,当我对它的了解不多时,我更愿意只进行所需的更改,并让具有专业知识的人根据需要进行更新和更正。 -------------- 非常感谢您的帮助,非常感谢!
    • 我相信是 5.23 Perl 版本号中的次要版本(“5.23”中的“23”)是一种查看版本是开发版本还是生产版本。奇怪的次要版本(如 23)是 Perl 的开发版本,不应该安装在生产环境中。 Perl 的最新生产版本是 5.28.2(仅在一周前发布)。
    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多