greenage
greenage

Reputation: 397

Perl Date Comparison Query

I'm trying to output "not ok" if the date provided within an input file is greater than one day from "today" using Perl version 5.8.8.

Initializing with "./code.sh < test.txt" works fine, when test.txt contains the following data:

07/02/2020 08/02/2020

When I rehash the code below to try an use "today's date" as a variable, and only have one date within the input file I get the following error:

Use of uninitialized value in concatenation (.) or string at code.sh line 27, <> line 1

Working code (with two dates in the input file):

#!/usr/bin/perl

use strict;
use warnings;

use Time::Piece;

#my $date = localtime->strftime('%d/%m/%Y');
#print "$date";

my $format = '%d/%m/%Y';

while (<>) {
   chomp;

         my ($str1, $str2) = split;
#        my ($date, $str2) = split;

#  my $dt1 = Time::Piece->strptime($date, $format);
   my $dt1 = Time::Piece->strptime($str1, $format);
   my $dt2 = Time::Piece->strptime($str2, $format);

   #  print "$date / $str2 ";
  print "$str1 / $str2 ";

     if ($dt2->julian_day - $dt1->julian_day ==1) {

         print "ok\n";

     } else {
         print "not ok\n";
         }
}

Broken code (with one date within the input file):

#!/usr/bin/perl

use strict;
use warnings;

use Time::Piece;

my $date = localtime->strftime('%d/%m/%Y');
print "$date";

my $format = '%d/%m/%Y';

while (<>) {
   chomp;

#        my ($str1, $str2) = split;
         my ($date, $str2) = split;

   my $dt1 = Time::Piece->strptime($date, $format);
#  my $dt1 = Time::Piece->strptime($str1, $format);
   my $dt2 = Time::Piece->strptime($str2, $format);

     print "$date / $str2 ";
 # print "$str1 / $str2 ";

     if ($dt2->julian_day - $dt1->julian_day ==1) {

         print "ok\n";

     } else {
         print "not ok\n";
         }
}

Not quite sure what I'm doing wrong...

Any help is appreciated

Upvotes: 1

Views: 73

Answers (1)

Polar Bear
Polar Bear

Reputation: 6798

Please pay more attention when you type your code, your sample had a few miss-types

#!/usr/bin/perl
#
# vim: ai:ts=4:sw=4
#

use strict;
use warnings;
use feature 'say';

use Time::Piece;

my $format = '%d/%m/%Y';
my $date   = localtime->strftime($format);

say "Today is: $date\n";

my @str_dates = <DATA>;

chomp(@str_dates);

my $date1 = Time::Piece->strptime($str_dates[0], $format);
my $date2 = Time::Piece->strptime($str_dates[1], $format);

my $days_diff = $date2->julian_day - $date1->julian_day;

my $msg = ($days_diff == 1) ? "ok" :"not ok";

say "$date2 :: $date1 => $msg";
say "$date2 :: $date1 =  $days_diff day(s) apart";

__DATA__
07/02/2020
08/02/2020

Output

Today is: 07/02/2020

Sat Feb  8 00:00:00 2020 :: Fri Feb  7 00:00:00 2020 => ok
Sat Feb  8 00:00:00 2020 :: Fri Feb  7 00:00:00 2020 =  1 day(s) apart

NOTE: I would recommend if you use:

vim better use with options: syntax on, ai,ts=4,sw=4

Upvotes: 1

Related Questions