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

将字符串拆分为散列(perl),perl,path,Perl,Path,目前我有点困惑 我正在寻找一种在递归散列中编写不定字数(用斜杠分隔)的字符串的方法 这些“字符串”是从文本数据库输出的 举个例子 “office/1/硬件/鼠标/计数/200” 下一个可以长也可以短 这必须从中创建: { office { 1{ hardware { mouse { count => 200 } }

目前我有点困惑

我正在寻找一种在递归散列中编写不定字数(用斜杠分隔)的字符串的方法

这些“字符串”是从文本数据库输出的

举个例子 “office/1/硬件/鼠标/计数/200”

下一个可以长也可以短

这必须从中创建:

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

有什么想法吗?

简单的递归函数就可以了

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'
                              }
                   }
        };

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

简单的递归函数就可以了

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'
                              }
                   }
        };

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

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

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 };
}

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

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 };
}

如果有许多行要读入一个散列,并且这些行的字段数可变,则会出现大问题,其他两个答案会通过破坏同级键或覆盖最终值来破坏数据。我这样假设是因为没有合理的理由将一行转换成散列

您必须对每个字段进行哈希处理。这也将使您能够最大程度地控制流程

our$hash={};
我们的$eolmark=“\000”;
while(我的$line=){
chomp$行;
my@fields=split/\//,$line;
我的$count=@字段;
my$h=$hash;
我的$i=0;
映射{(+$i==$count)?
($h->{$\u}{$eolmark}=1):
($h=$h->{$|}{}};
}@字段;
}
$h->{$\u}{$eolmark}=1
您需要特殊的“行尾”键,这样您就可以识别记录的结尾,并且仍然允许更长的记录共存。如果你有两张唱片
foo/bar/baz-foo/bar/baz/qux
,第二个将覆盖第一个的最终值

$h=$h->{$| |={}
此语句是一种非常方便的习惯用法,可以一步创建和填充缓存,然后对其进行快捷引用。请勿多次执行哈希查找


HTH

如果有许多行要读入一个散列,并且这些行的字段数可变,则会出现大问题,另外两个答案会通过破坏同级键或覆盖最终值来破坏数据。我这样假设是因为没有合理的理由将一行转换成散列

您必须对每个字段进行哈希处理。这也将使您能够最大程度地控制流程

our$hash={};
我们的$eolmark=“\000”;
while(我的$line=){
chomp$行;
my@fields=split/\//,$line;
我的$count=@字段;
my$h=$hash;
我的$i=0;
映射{(+$i==$count)?
($h->{$\u}{$eolmark}=1):
($h=$h->{$|}{}};
}@字段;
}
$h->{$\u}{$eolmark}=1
您需要特殊的“行尾”键,这样您就可以识别记录的结尾,并且仍然允许更长的记录共存。如果你有两张唱片
foo/bar/baz-foo/bar/baz/qux
,第二个将覆盖第一个的最终值

$h=$h->{$| |={}
此语句是一种非常方便的习惯用法,可以一步创建和填充缓存,然后对其进行快捷引用。请勿多次执行哈希查找


HTH

到目前为止你都试了些什么?这样的杂凑有什么意义?你想用它干什么?从技术上讲,它不是很有用。到目前为止,您尝试了什么?这样的散列有什么意义?你想用它干什么?从技术上讲,它不是很有用。谢谢!这正是我需要的。我真的认为这更难,但你的代码很简单!谢谢你!如果您有多个记录,这将刷新记录。谢谢!这正是我需要的。我真的认为这更难,但你的代码很简单!谢谢你!如果您有多个记录,这将删除记录。我需要将基于文本的数据库(astdb或星号数据库)放入哈希中。通过这个散列,我想在web界面中显示这个数据库。你的代码正在运行,但我不喜欢自动调用sub。因此,我更喜欢鲍勃的变体。无论如何谢谢你!我需要将一个基于文本的数据库(astdb或asterisk数据库)放入散列。通过这个散列,我想在web界面中显示这个数据库。你的代码正在运行,但我不喜欢自动调用sub。因此,我更喜欢鲍勃的变体。无论如何谢谢你!