此刻我有点困惑。。
我正在寻找一种方法,在递归哈希中编写一个单词数不定(用斜杠分隔(的字符串。
这些";字符串";是从文本数据库输出的。
例如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 = "