Perl Posix :: Strptime - I miei dati sembrano 9:31:00 - Voglio estrarre il minuto ed eseguire un calcolo
Domanda
Voglio estrarre il minuto da un tempo specificato che esiste nella seconda colonna di un file delimitato da virgole ed eseguire un calcolo. Il formato del tempo è il seguente:
9:31:00
Voglio estrarre il valore minuto e calcolare finora i minuti totali. Lo faccio in subroutine get_time. Ma il valore restituito è sempre zero, il che mi fa pensare che non sto usando correttamente Posix :: Strptime. Qualsiasi intuizione sarebbe meravigliosa. Grazie.
#!/usr/bin/env perl
use strict;
use POSIX::strptime;
use Text::CSV;
sub get_time
{
my($str) = @_;
my ($sec, $min, $hour) = (POSIX::strptime($str, '%I:%M:%S')) [3,4,5];
print "$hour\n";
return($hour*60 + $min)
}
open my $fh, "<", datafile.txt
my $csv = Text::CSV->new() or die "Failed to create Text::CSV object";
my $line = <$fh>;
die "Failed to parse line <<$line>>\n\n" unless $csv->parse($line);
my @columns = $csv->fields();
while ($line = <$fh>)
{
chomp $line;
die "Failed to parse line <<$line>>\n\n" unless $csv->parse($line);
my @columns = $csv->fields();
die "Insufficient columns in <<$line>>\n" if scalar(@columns) < 1;
my $minute = get_time($columns[1]);
print "$minute\n";
}
Soluzione
In get_time, hai la linea
my ($sec, $min, $hour) = (POSIX::strptime($str, '%I:%M:%S')) [3,4,5];`
Secondo il Documenti, Strptime ritorna
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = POSIX::strptime("string", "Format");
Quindi sembra che tu abbia bisogno
my ($sec, $min, $hour) = (POSIX::strptime($str, '%I:%M:%S')) [0,1,2];
invece.
Buona fortuna!
Altri suggerimenti
È impossibile determinare correttamente il numero di minuti in un giorno prima di un certo periodo senza conoscere il fuso orario e possibilmente la data.
$ perl -MDateTime -E'
for (10..16) {
my $dt = DateTime->new(
year => 2011,
month => 3,
day => $_,
hour => 9,
minute => 31,
second => 0,
time_zone => "America/New_York",
);
( my $ref_dt = $dt->clone )->truncate(to => "day");
my $minutes = ($dt - $ref_dt)->in_units("minutes");
say($dt->ymd, " ", $minutes);
}
'
2011-03-10 571
2011-03-11 571
2011-03-12 571
2011-03-13 511 <------
2011-03-14 571
2011-03-15 571
2011-03-16 571