2015-09-29 38 views
-2

我希望用這種格式的「d days,h:mm:ss」(或「h:mm:ss」如果設備不超過一天了時間,但我可以計劃如何以檢查)Perl:如何從「d days,h:mm:ss」中提取

我問的是一個例行如何提取它的dhmmss從字符串所以我可以做計算(使用DateTime我也在這裏找到)

+0

'DateTime :: Format :: Duration'將是一種方法。 – hobbs

回答

2

這可以用一個簡單的正則表達式與一些捕獲組解決。

這需要一段時間格式化爲「d days,h:mm:ss」,並且會給你日子,小時,分鐘和秒鐘。

#!/usr/bin/perl 
use strict; 
use warnings; 

# Define a random time 
my $time = '4 days, 03:44:23'; 

# Extract the data from the time 
my ($days, $h, $m, $s) = $time =~ m/([0-9]+)\sdays,\s([0-9]+):([0-9]+):([0-9]+)/; 

# Print the output 
print 'time: '.$time."\n\n"; 
print 'days: '.$days."\n"; 
print 'h : '.$h."\n"; 
print 'm : '.$m."\n"; 
print 's : '.$s."\n"; 

有關如何使用正則表達式您可能會發現更多的信息,這是很有幫助的:perlre (regular expression tutorial)

此外,由於你是新來使用Perl,我會補充一點,你應該總是的添加use strict;use warnings;代碼的頂部。它會阻止你犯愚蠢的錯誤(例如試圖使用一個未定義的變量),併爲你節省很多頭痛。


您還可以通過將該匹配放在if語句中來驗證您是否有良好的數據。養成這樣做的習慣是件好事。

my ($days, $h, $m, $s); 
if ($time =~ m/([0-9]+)\sdays,\s([0-9]+):([0-9]+):([0-9]+)/) { 
    ($days, $h, $m, $s) = ($1, $2, $3, $4) 
} 
else { 
    die "Invalid date format encountered!"; 
} 
+0

謝謝!這就是我一直在尋找的 – Arjan

+0

是的,也在那裏 - 再次感謝。 – Arjan

2

因爲這看起來像一個可教時刻,我要補充的是tjwrona1992的正則表達式

my ($days, $h, $m, $s) = $time =~ m/([0-9]+)\sdays,\s([0-9]+):([0-9]+):([0-9]+)/; 

可以使用/ x修飾符,允許空格被寫入和意見,使其更易消化人類消費者:

my ($days, $h, $m, $s) = $time =~ m/ 
       ([0-9]+) \s days, # $1 will be days 
       \s 
       ([0-9]+) :  # $2 = hours  
       ([0-9]+) :  # $3 = minutes 
       ([0-9]+)   # $4 = seconds 

     /x or die "the regex did not match '$time'"; 
+0

也謝謝你!我現在可以選擇 – Arjan