【问题标题】:Default a value for missing hash缺少哈希的默认值
【发布时间】:2018-05-11 00:58:30
【问题描述】:

我在 Perl 中创建了一个哈希 my %hash = (2 => 'dog', 1 => 'cat');

当我打印 $hash{3} 时,它会出现预期的错误 (use of uninitialzed value in print)。但是如果不在哈希中,有没有办法默认一个值?

【问题讨论】:

  • 您会遇到什么错误,为什么会这样?我希望$hash{1} 评估为字符串cat。你想避免使用$hash{9} // 'no animal' 的显式默认值吗?
  • 您发布的作业有语法错误,因为您使用的是非 ASCII 引号
  • 我得到use of uninitialzed value in print at test.pl line 121,2 etc 来自数据库。因此,如果数字不在散列中,我不知道是否有办法将它们分配给一些默认值,比如没有动物。如果hash{3} 在我的数据库循环中。不知道有没有办法显示默认值没有动物。
  • 你不清楚你想要的输出是什么。

标签: perl


【解决方案1】:
my $value = exists($hash{$k}) ? $hash{$k} : 'default';

要实际更改哈希,请使用

$hash{$k} = 'default' if !exists($hash{k});

如果$hash{$k} 存在,则始终定义它,您也可以使用

my $value = defined($hash{$k}) ? $hash{$k} : 'default';

可以简化为

my $value = $hash{$k} // 'default';   # 5.10+

要实际更改哈希,请使用

$hash{$k} = 'default' if !defined($hash{k});

$hash{$k} //= 'default';   # 5.10+

如果$hash{$k} 存在则始终为真,您也可以使用

my $value = $hash{$k} ? $hash{$k} : 'default';

可以简化为

my $value = $hash{$k} || 'default';

要实际更改哈希,请使用

$hash{$k} = 'default' if !$hash{k};

$hash{$k} ||= 'default';

【讨论】:

  • 我回来后会试试这个。似乎它会起作用。
  • 另外值得一提的是,您可以在散列中设置适当的值:$hash{$k} //= 'default';
  • @Grant:这将破坏任何实际存在但其值为undef的元素
  • 很明显。我的建议是在@ikegami 的上下文中提出的,解释了$hash{$k} // 'default' 对于始终定义值(如果存在)的情况。
  • @Grant McLean,添加了您建议的更改。忽略巨魔
【解决方案2】:

我建议你看看 Hash::DefaultValue 模块,它允许您指定一个哈希值,如果元素不存在,将返回而不是 undef

【讨论】:

  • 以后会试试这个。 Perl 新手,所以我只经常使用它。感谢您的建议。
  • @user:这不像为一辆新的法拉利分叉!您只需安装模块,添加几个语句,然后像往常一样使用哈希。
猜你喜欢
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2021-11-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多