0

アラスカ (AK) とハワイ (HI) に一律 $25 の手数料を追加したいのですが、以下の配送マトリックスに州と一律料金を追加すると、テストが中断されます。誰かが私を正しい方向に向けることができますか?

my $totalPounds = sprintf("%.2f",($totalWeight / 16));
#my $shipping = &getShipUPS($totalPounds, $zip, $shipType);
if ($subtotal <= 24.99) {$shipping = '10.95';}
elsif (($subtotal > 24.99) && ($subtotal <= 74.99)) {$shipping = '13.95';}
elsif (($subtotal > 74.99) && ($subtotal <= 149.99)) {$shipping = '14.95';}
elsif ($subtotal >= $150) {$shipping = '18.95';}
elsif ($state eq 'HI','AK') ($subtotal <= 24.99) {$shipping = '10.95'+'25.00';}
elsif ($state eq 'HI','AK') (($subtotal > 24.99) && ($subtotal <= 74.99)) {$shipping = '13.95'+'25.00';}
elsif ($state eq 'HI','AK') (($subtotal > 74.99) && ($subtotal <= 149.99)) {$shipping = '14.95'+'25.00';}
elsif ($state eq 'HI','AK') ($subtotal >= $150) {$shipping = '18.95'+'25.00';}else 

$shipping = sprintf("%.2f", $shipping);

my $total = $subtotal + $tax + $shipping;
$subtotal = sprintf("%.2f", $subtotal);
$total = sprintf("%.2f", $total);
4

2 に答える 2

2

eqこのように複数のパラメータを使用することはできません

$state eq 'HI','AK'

あなたがする必要があります

$state eq 'HI' or $state eq 'AK'

elsifまた、このように最初の後に別の括弧を入れることはできません

elsif ($state eq 'HI','AK') ($subtotal >= $150) 

あなたがする必要があります

elsif ( ($state eq 'HI' or $state eq 'AK') or ($subtotal >= $150) )
#     ^----               main parantheses                 -------^

もちろん、より賢明な選択はハッシュを使用することかもしれません

%extra_charges = ( AK => 25, 
                   HI => 25,
                   # etc
);
...
$subtotal += $extra_charges{$state};   # assuming no missing states

if-else ロジックもあらゆる種類の冗長です。これはあなたのコードと同等でなければなりません:

if    ($subtotal <= 24.99)            { $shipping = '10.95' }
elsif ($subtotal <= 74.99)            { $shipping = '13.95' }
elsif ($subtotal <= 149.99)           { $shipping = '14.95' }
else                                  { $shipping = '18.95' }

if ($state eq 'AK' or $state eq 'HI') { $shipping += 25 }

それらの曲がりくねったifの森は、人をめまいさせるのに十分であり、それらのほとんどは必要ありませんでした. 値が 24.99 以下でない場合は、24.99 より大きい必要があるため、再確認する必要はありません。

于 2013-06-26T10:14:50.350 に答える
1

そのコードは完全に混乱しており、複数の構文エラーがあり、DRY に違反しています。

小計に応じて、最初に基本的な送料を計算するのが最善です。2 番目のステップでは、州がハワイまたはアラスカの場合、25 ドルの料金を追加します。

my @shipping_fees = (
  # max subtotal => fee
  [  24.99 => 10.95 ],
  [  74.99 => 13.95 ],
  [ 149.99 => 14.95 ],
  [ inf    => 18.95 ],
);

my %extra_fees_per_state = (
  AK => 25.00,
  HI => 25.00,
);

それで:

my $shipping;
for my $shipping_fee (@shipping_fees) {
  my ($max, $fee) = @$shipping_fee;
  if ($subtotal <= $max) {
    $shipping = $fee;
    last;
  }
}

if (defined( my $extra = $extra_fees_per_state{$state})) {
  $shipping += $extra;
}
于 2013-06-26T10:25:50.557 に答える