【问题标题】:Perl grocery programPerl 杂货程序
【发布时间】:2017-06-20 07:10:52
【问题描述】:

我有一组我需要购买的杂货和一个哈希,其中杂货作为键,这些物品的成本作为值。我需要一个程序,它会根据哈希中可用的内容告诉我账单的总成本,并告诉我不可用的项目。我该怎么做呢?这是我目前所拥有的:

my %stash = ('tofu' => .30, 'berrys' => .30, 'water' => .30, 'nuts' => .30, 'chips' => .30, 'soda' => .30, 'jam' => .30, 'meat' => .30, 'kale' => .30, 'peas' => .30); 

my @itemsneeded = ('tofu', 'berrys', 'water', 'nuts', 'chips', 'rice', 'vinegar'); 

在伪代码中,我想遍历我需要的项目,如果它等于 %stash 中的键,则它会汇总这些项目的成本,如果项目不可用,则将这些名称存储在另一个变量中.然后打印出总成本和不可用的项目。到目前为止我是这样做的:

foreach my $items (@itemsneeded) {
if ($items eq 

我被困在那里。任何帮助将不胜感激!

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow。 SO 不适合从头开始教授编程,而是回答特定问题。我建议您从 perl.org/learn.html 开始,学习一些 Perl,尝试编写代码,然后再提出具体问题。如果你已经有了一些代码,让我们看看吧!
  • @Schwern 你好 Schwern!谢谢您的回复。我刚刚发布了我到目前为止所拥有的......任何帮助都会非常棒:)
  • 您想获取哈希中项目的值并将它们相加。在您的循环中,您可以像这样访问这些值:$stash{$item}.

标签: arrays perl loops if-statement hash


【解决方案1】:

首先,让事情变得理智。

use strict;
use warnings;
use v5.10;

开启strict,现在未声明的变量是一个错误。它打开warnings,所以当你做看起来像错误的事情时,Perl 会警告你。并且开启5.10 features,其中最重要的是say

您的数据设置正确。接下来,您需要地方来存储您的全部和不可用的项目。

my $total = 0;
my @unavailable;

然后遍历您的@itemsneeded,检查哪些是可用的,并将它们的价格添加到您的$total

for my $item (@itemsneeded) {
    if( defined $stash{$item} ) {
        $total += $stash{$item};
    }
    else {
        push @unavailable, $item;
    }
}

defined $stash{$item} 检查$item 是否在%stash 中并具有定义的值。如果有,请将其价格添加到$total

push @unavailable, $item; 将该项目添加到 @unavailable 项目列表的末尾。

然后打印它们。需要进行一些格式化。

printf "The total cost is %.2f\n", $total;

如果你只是打印出$total,你会得到类似0.3 的东西,这不是我们写钱的方式。 %.2f 说要写精确到两个小数位的数字。 printf 有自己的小型迷你格式化语言,您可以在sprintf 的文档中阅读所有相关信息。那是 printf 但它不打印,它返回一个字符串(“s”代表“返回一个字符串”)。

然后打印出@unavailable项目列表。

say "Yes we have no ", join(", ", @unavailable), ".";

我们需要用逗号连接列表中的元素才能正确格式化。不需要换行,say 会为我们添加。

【讨论】:

  • 嗨@Schwern!非常感谢你做的这些。不幸的是,当我运行代码时,出现此错误:“参数“=>”在 main.pl 第 36 行不是数字加法 (+)。第 36 行是我放置代码 '$total += $stash{ 的位置物品};'你认为是什么问题??
  • $stash{$item} 是否访问项目的成本/价值?还是只是项目名称/键?
  • @IwanttoLearnPerl 对于错误,您以某种方式将字符串=> 作为%stash 的值放入。您应该能够使用像 Atom 这样的语法高亮编辑器来发现错误。至于$stash{$item},则获取与$item 关联的%stash 中的值。所以$stash{"tofu"}0.30
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多