3h4m 11040 3h4m 1h2m3s 3723 1h2m3s 1h5s 3605 1h5s 3m4s 184 3m4s 1d2h3m4s 93784 1d2h3m4s 3x -1 2m2m -1 23h59m59s 86399 23h59m59s #### my @time_values = qw [ d h m s ]; my %time_value = ( d => 86400, h => 3600, m => 60, s => 1 ); sub string_to_time { my ($time) = @_; my $value = 0; foreach my $letter (@time_values) { if ($time =~ s/(\d+)$letter//) { $value += $1 * $time_value{$letter}; } } return -1 if length $time; return $value; } sub time_to_string { my ($time) = @_; my $value = ''; foreach my $letter (@time_values) { my $time_value = $time_value{$letter}; if ($time > $time_value) { $value .= int($time/$time_value).$letter; $time %= $time_value; } } return $value; } #### #!/usr/bin/perl -w use strict; my @test = qw [ 3h4m 1h2m3s 1h5s 3m4s 1d2h3m4s 3x 2m2m 23h59m59s ]; foreach (@test) { my $s2t = string_to_time($_); my $t2s = time_to_string($s2t); printf ("%-15s %-10s %-10s\n", $_, $s2t, $t2s); }