3

次のような時間差のある文字列があります。

12:03:22  <- where
 ^  ^  ^
 |  |  +minutes
 |  +hours
 +days

必須は分、時間、日のみ省略できますが、ここではたとえば120:30、つまり120時間30分にすることができます。

NOW +差の日付と時刻を計算する必要があるため、たとえば次のようになります。

when now is "May 20, 13:50" and
the string is "1:1:5"
want get as result: "2012 05 21 14 55" (May 21, 14:55)

DateTimeは知っていますが、入力文字列を解析する簡単な方法は何ですか?私はここよりも良い方法だと確信しています:

use _usual_things_;
my ....
if($str =~ m/(.*):(.*):(.*)/) {
   $d = $1; $h = $2; $m = $3;
}
elsif( $str =~ m/(.*):(.*)/ ) {
   $h = $1; $m = $2;
} elsif ($str =~ m/\d+/ ) {
   $m = $1;
}
else {
  say "error";
}

そして、解析された日、時間、分を現在の日付に追加するにはどうすればよいですか?

4

2 に答える 2

8

reverseフォーマットのチェックを避けるために使用するのはどうですか?

my ($m, $h, $d) = reverse split /:/, $str;

これを現在の日付に追加するには、DateTimeを使用します。

print DateTime->now->add(days    => $d // 0,
                         hours   => $h // 0,
                         minutes => $m);
于 2012-05-21T12:08:59.577 に答える
-1

解析は1回実行できますが、分岐は実行できません。のトークは避けられません。これがサンプル実装です。

$Str = '12:03:22' ;

@Values = ($Str=~/\G(\d\d):?/g) ;

print "error with input" if not @Values;

if( @Values == 3) { print "Have all 3 values\n" }
elsif( @Values == 2) { print "Have 2 values\n" }
于 2012-05-21T12:12:48.100 に答える