Regex 正则表达式如何匹配a/b/c。。。?
如果我有一个像下面这样的数组,其中元素的顺序是随机的,每个元素可以有多少个级别没有限制。这里只显示3个级别<代码>a、Regex 正则表达式如何匹配a/b/c。。。?,regex,perl,hash,Regex,Perl,Hash,如果我有一个像下面这样的数组,其中元素的顺序是随机的,每个元素可以有多少个级别没有限制。这里只显示3个级别a、b和c 我希望能够解析这样的数组,并在只有3个级别的情况下,将结果存储在哈希的散列中 $VAR1 = { 'a' => { 'b' => 'c' } }; 问题 我的问题是如何为此编写正则表达式,因为第一级末尾没有一个/,而且由于元素的顺序是随机的,如果a/b/c已经
b
和c
我希望能够解析这样的数组,并在只有3个级别的情况下,将结果存储在哈希的散列中
$VAR1 = {
'a' => {
'b' => 'c'
}
};
问题
我的问题是如何为此编写正则表达式,因为第一级末尾没有一个/
,而且由于元素的顺序是随机的,如果a/b/c
已经插入到散列中,那么元素a
不应该删除键a
的散列值
那么如何解决这样的问题呢
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @ar = ("a", "a/b", "a/b/c");
my %h = ();
foreach my $a (@ar) {
}
例如:
my @ar = ("a", "a/b", "a/b/c");
my %h;
for (@ar) {
my $levels = split /\//;
for (my $i = 0; $i <= $#levels; $i++) {
# How ever you want to set-up your hash of hashes
# But each for loop iteration would give you a "level" of input
}
}
my@ar=(“a”、“a/b”、“a/b/c”);
我的%h;
for(@ar){
我的$levels=split/\/;
对于(my$i=0;$i示例:
my @ar = ("a", "a/b", "a/b/c");
my %h;
for (@ar) {
my $levels = split /\//;
for (my $i = 0; $i <= $#levels; $i++) {
# How ever you want to set-up your hash of hashes
# But each for loop iteration would give you a "level" of input
}
}
my@ar=(“a”、“a/b”、“a/b/c”);
我的%h;
for(@ar){
我的$levels=split/\/;
对于(我的$i=0;$i
通常,您会分配或修改由DiveRef返回的标量引用(或分配给DiveVal的结果),但这里您只想确保键存在
\(…)
将通过split返回的列表转换为标量引用列表,这会告诉Data::Diver这些总是散列键,如果是数值的,则不可能是数组索引
通常,您会分配或修改由DiveRef返回的标量引用(或分配给DiveVal的结果),但这里您只想确保键存在
\(…)
将通过split返回的列表转换为标量引用列表,这会告诉Data::Diver这些总是散列键,如果它们是数字的,则不可能是数组索引。获取
"a" => $tree = "a";
"a", "a/b" => $tree = { "a" => "b" };
"a", "a/b", "a/b/c" => $tree = { "a" => { "b" => "c" } };
"a", "a/b", "a/c" => $tree = { "a" => { "b" => undef, "c" => undef } };
代码:
但这不是一个好的数据结构,因为您需要使用ref
来导航它
"a" => $tree = { "a" => undef };
"a", "a/b" => $tree = { "a" => { "b" => undef } };
"a", "a/b", "a/b/c" => $tree = { "a" => { "b" => { "c" => undef } } };
"a", "a/b", "a/c" => $tree = { "a" => { "b" => undef, "c" => undef } };
代码:
看看构建这个数据结构有多简单?当您尝试导航它时,您将获得类似的好处
注意,您可以使用创建第二个数据结构(尽管我记得它要慢得多)
得到
代码:
但这不是一个好的数据结构,因为您需要使用ref
来导航它
"a" => $tree = { "a" => undef };
"a", "a/b" => $tree = { "a" => { "b" => undef } };
"a", "a/b", "a/b/c" => $tree = { "a" => { "b" => { "c" => undef } } };
"a", "a/b", "a/c" => $tree = { "a" => { "b" => undef, "c" => undef } };
代码:
看看构建这个数据结构有多简单?当您尝试导航它时,您将获得类似的好处
注意,您可以使用创建第二个数据结构(尽管我记得它要慢得多)
“a”将如何处理
是否要处理输入?在这种情况下,值应该是什么并不明显,哈希不能只有一个键。如果这是您试图解析的路径,请改用文件::Spec
模块拆分目录
。出于好奇,字符串实际上代表什么?根据正如TLP为文件路径指出的,它们是。但是如果值在a案例中应该是未定义的,那么它也应该在c案例中({'a'=>{'b'=>{'c'=>undef}}}
),那么“a”将如何
是否要处理输入?在这种情况下,值应该是什么并不明显,哈希不能只有一个键。如果这是您试图解析的路径,请改用文件::Spec
模块拆分目录
。出于好奇,字符串实际上代表什么?根据正如TLP为文件路径指出的,它们是。但是如果值在a案例中应该是未定义的,那么它也应该在c案例中({'a'=>{'b'=>{'c'=>未定义}}
)
my $tree;
for ("a", "a/b", "a/b/c") {
my $p = \$tree;
$p = \( ($$p)->{$_} ) for split qr{/};
}
use Data::Diver qw( DiveRef );
my $tree;
for ("a", "a/b", "a/b/c") {
DiveRef($tree //= {}, \split(qr{/}));
}