0

2 つのパラメーター (時間と分) (HH1:MN1 と HH2:MN2) を受け取るスクリプトを作成したいと思います。

  • #ARGV = 2 の場合に有効である必要があります
  • 提供された時刻が正しいかどうかを検証します (0 から 200 までの時間と 0 から 59 までの分)
  • これらの時間を追加して、結果に出力します
  • Nbday を印刷するのに 24 時間以上かかる場合。HH:分
  • 7 日以上の場合は Week と表示されます。翌日; HH:最小。

私はこれから始めましたが、続行する方法がわかりません.計算のためにどんな助けやアイデアも歓迎されます ありがとう

#!/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'
4

2 に答える 2

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/

(正規表現はもう少し単純かもしれませんが、バックトラッキングの可能性を事実上排除するように書かれています。)

あなたはすでに質問しており、私たちは数学の部分に丁寧に解決策を提供したのに、なぜもう一度質問するのですか?

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
于 2013-03-27T20:44:48.743 に答える
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'
于 2013-03-27T20:50:43.927 に答える