2013-03-27 30 views
0

我想創建一個腳本,將得到2個paramerters(小時和分鐘)(HH1:MN1和HH2:N2)加入時間的Perl腳本

  • 它具有有效的,如果#ARGV = 2
  • 的Valide如果時間提供正確(0之間〜200和小時分鐘之間0至59)
  • 添加那些thow時間和打印到結果
  • 如果它超過24小時,以打印Nbday; HH:最小
  • 如果超過7天它將打印周; nddays; HH:最小。

我開始用這個,但不能figureout如何繼續 任何幫助或想法會受到歡迎的計算 感謝

#!/usr/bin/perl 

if ($#ARGV != 2) 
{ 
print STDERR "Erreur Parameters have to be 2\n"; 
exit (-1); 
} 
if ($ARGV[0] = ~/([0-9] | 1 [0-9] ? [0-9] | 200) : ([0-5] ? [0-9]) /) 
{ 
$heures1 = $1; 
$minutes1 = $2; 
} 
else 
{ 
print STDERR "first parameter invalid\"; 
exit (-1); 
} 
if ($ARGV[1] = ~/([0-9] | 1 [0-9] ? [0-9] | 200) : ([0-5] ? [0-9]) /) 
{ 
$heures2 = $3; 
$minutes2 = $4; 
} 
`else ` 
{ 
print STDERR "Second parameter invalid\"; 
exit (-1); 
$heures = $heures1 + $heures2; 
$minutes = $minutes1 + $minutes2' 

回答

2

驗證代碼是非常簡單的:

sub usage { 
    print STDERR $_[0] if @_; 
    print STDERR "usage: ...\n"; 
    exit(1); 
} 

usage() if @ARGV != 2; 

my ($hours1, $minutes1) = $ARGV[1] =~ /^([0-9]+):([0-9]+)\z/ or usage(); 
my ($hours2, $minutes2) = $ARGV[1] =~ /^([0-9]+):([0-9]+)\z/ or usage(); 

0 <= $hours1 && $hours1 <= 200 or usage("Invalid number of hours for first argument\n"); 
0 <= $minutes1 && $minutes1 <= 59 or usage("Invalid number of minutes for first argument\n"); 
0 <= $hours2 && $hours2 <= 200 or usage("Invalid number of hours for second argument\n"); 
0 <= $minutes2 && $minutes2 <= 59 or usage("Invalid number of minutes for second argument\n"); 

範圍檢查可以通過正則表達式來完成,但它很容易出錯並且不可讀。

/^0*(0|1[0-9]{0,2}|2(?:00?|[1-9])?|[3-9][0-9]?):0*(0|[1-5][0-9]?|[6-9])\z/ 

(正則表達式可能是一個有點簡單,但它寫入到根本上消除回溯的可能性。)

您已經asked,我們優雅的數學部分提供的解決方案,那麼你爲什麼要問再次?

my ($hours1, $minutes1) = split /:/, $arg1; 
my ($hours2, $minutes2) = split /:/, $arg2; 

my $hours = $hours1 + $hours2; 
my $minutes = $minutes1 + $minutes2; 

$hours += ($minutes - ($minutes % 60))/60; $minutes %= 60; 
my $days = ($hours - ($hours % 24))/24; $hours %= 24; 
my $weeks = ($days - ($days % 7))/7; $days %= 7; 

至於輸出部分,你應該可以自己管理。一個有用的技巧:

sprintf('%02d', $minutes) # 0-padded to two digits 
0
#!/usr/bin/perl 

die "Erreur Parameters have to be 2" if (scalar(@ARGV) != 2) 

if ($ARGV[0] =~ /^([0-9]|1[0-9]?[0-9]|200):([0-5]?[0-9])$/) { 
    $heures1 = $1; 
    $minutes1 = $2; 
} else { 
    die "first parameter invalid"; 
} 

if ($ARGV[1] =~ /^([0-9]|1[0-9]?[0-9]|200):([0-5]?[0-9])$/) { 
    $heures2 = $3; 
    $minutes2 = $4; 
} else { 
    die "Second parameter invalid"; 
} 

$heures = $heures1 + $heures2; 
$minutes = $minutes1 + $minutes2' 
+0

'我的($ heures1,$ minutes1)= $ ARGV [0] =〜/ ^([0-9] | 1 [0-9] [0-9 ] | 200):([0-5]?[0-9])$/ 或死於「第一個參數無效」;'不使用全局變量,只佔用兩行而不是七行。 – ikegami 2013-03-28 01:13:24

+1

'(標量(@ARGV)!= 2)'是寫'@ARGV!= 2'的複雜方式。 – ikegami 2013-03-28 01:14:07

+0

你不準20:00。這表明,正則表達式不是範圍檢查的方式。很容易出錯,而且這是不可讀的(證明你沒有注意到20:00不匹配)。 – ikegami 2013-03-28 01:27:29