添加时间脚本Perl
我想创建一个脚本,它将接收2个参数(小时和分钟)(HH1:MN1和HH2:MN2)添加时间脚本Perl,perl,Perl,我想创建一个脚本,它将接收2个参数(小时和分钟)(HH1:MN1和HH2:MN2) 如果#ARGV=2,则它必须有效 如果提供的时间正确,则验证有效(0到200之间的小时和0到59之间的分钟) 添加这些时间并打印到结果中 如果每天打印时间超过24小时;HH:Min 如果超过7天,则每周打印一次;第二天;HH:Min 我从这个开始,但不知道如何继续 对于计算,欢迎提供任何帮助或想法 谢谢 验证代码非常简单: sub usage { print STDERR $_[0] if @_;
- 如果#ARGV=2,则它必须有效
- 如果提供的时间正确,则验证有效(0到200之间的小时和0到59之间的分钟)
- 添加这些时间并打印到结果中
- 如果每天打印时间超过24小时;HH:Min
- 如果超过7天,则每周打印一次;第二天;HH:Min
验证代码非常简单:
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");
(正则表达式可以简单一点,但编写它实际上是为了消除回溯的可能性。)
你和我们已经优雅地为数学部分提供了解决方案,那你为什么还要再问
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
my($heures1,$minutes1)=$ARGV[0]=~/^([0-9]| 1[0-9]?[0-9]| 200):([0-5]?[0-9])$/或死“第一个参数无效”
不使用全局变量,只需要两行而不是七行。(标量(@ARGV)!=2)
是一种复杂的书写方式@ARGV!=2
。您不允许20:00。这表明正则表达式不是范围检查的方法。很容易出错,而且不可读(可以证明,您没有注意到20:00不匹配)。
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
#!/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'