【问题标题】:How to split string by comma into a hash in Perl?如何在 Perl 中通过逗号将字符串拆分为哈希?
【发布时间】:2021-05-08 20:15:24
【问题描述】:

我有以下代码:

my @logs = split(",",$opts->{"logs"});
$opt_href->{"logs"} = \@logs;

它基本上用逗号分割$opts->{"logs"} 并保持数组引用。稍后我需要检查$opt_href->{"logs"} 数组中是否存在字符串。查看this topic,我发现建议保留散列,而不是数组。我可以这样做:

my %logs;
for each my $log (split(",",$opts->{"logs"})) {
    $logs{$log} = 1;
}
$opt_href->{"logs"} = \%logs;

有没有更好的方法来做到这一点?可能是一个/两个衬垫?

【问题讨论】:

  • Re "我看到建议保留哈希",不完全。建议使用散列来实现集合。您是否尝试从$opts->{logs} 中的值形成一个集合?
  • 我同意 ikegami 的观点,即完全不确定您是否需要哈希。尤其是手动编辑的选项文件中的字符串。哈希将区分foo fooFOO,而例如正则表达式匹配可以不那么严格。这一切都取决于对您的代码重要的内容。在大多数情况下,检查哈希键与遍历数组是一个小的优化。
  • @TLP 他们说他们“需要检查字符串是否存在......”,这似乎就是他们决定使用哈希的原因,因为它看起来既高效又方便向上结构。那么这确实是一个很好的解决方案,虽然我同意从这个问题中不清楚这是否是组织数据的最佳方式。 (但这不是他们要的,所以没关系)

标签: perl


【解决方案1】:
my %logs = map { $_ => 1 } split /,/, $opts->{logs};
$opt_href->{logs} = \%logs;

或者,使用{ }构造的匿名哈希引用

$opt_href->{logs} = { map { $_ => 1 } split /,/, $opts->{logs} };

【讨论】:

  • "匿名哈希引用,由{ }构造" ---更准确地说,{}构造了一个匿名哈希并返回一个对它的引用跨度>
猜你喜欢
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多