将字符串拆分为散列的散列(perl)



此刻我有点困惑。。

我正在寻找一种方法,在递归哈希中编写一个单词数不定(用斜杠分隔(的字符串。

这些";字符串";是从文本数据库输出的。

例如Given"办公室/1/硬件/鼠标/计数/200";

下一个可以更长也可以更短。。

这必须从中创建:

{
office {
1{
hardware {
mouse {
count => 200
}
}
}
}
}

知道吗?

向后工作。把绳子分开。使用最后两个元素生成最内部的散列。当存在更多的单词时,将每个单词都作为新哈希的关键字,并将内部哈希作为其值。

my $s = "office/1/hardware/mouse/count/200";
my @word = split(///, $s);
# Bottom level taken explicitly
my $val = pop @word;
my $key = pop @word;
my $h = { $key => $val };
while ( my $key = pop @word )
{
$h = { $key => $h };
}

简单的递归函数应该执行

use strict;
use warnings;
use Data::Dumper;
sub foo {
my $str = shift;
my ($key, $rest) = split m|/|, $str, 2;
if (defined $rest) {
return { $key => foo($rest) };
} else {
return $key;
}
}
my $hash = foo("foo/bar/baz/2");
print Dumper $hash;

输出

$VAR1 = {
'foo' => {
'bar' => {
'baz' => '2'
}
}
};

但正如我在评论中所说:你打算用这个做什么?它不是一个非常有用的结构。

如果有许多行要读取到一个哈希中,并且这些行的字段数量可变,则会出现大问题,另外两个答案将通过破坏同级键或覆盖最终值来破坏数据。我之所以这么认为,是因为没有合理的理由将一行转换为散列。

您将不得不遍历每个字段的散列。这也将使您对流程拥有最大的控制权。

our $hash = {};
our $eolmark = "00";
while (my $line = <...>) {
chomp $line;
my @fields = split ///, $line;
my $count = @fields;
my $h = $hash;
my $i = 0;
map { (++$i == $count) ?
($h->{$_}{$eolmark} = 1) :
($h = $h->{$_} ||= {});
} @fields;
}

$h->{$_}{$eolmark} = 1您需要特殊的";行的末尾";键,这样您就可以识别记录的末尾,并且仍然允许较长的记录共存。如果你有两张唱片foo/bar/baz foo/bar/baz/quux,则第二个将覆盖第一个的最终值。

$h = $h->{$_} ||= {}这句话是一个非常方便的习惯用法,可以在一步中创建和填充缓存,然后对其进行快捷引用。

HTH-

相关内容

  • 没有找到相关文章

最新更新