$all="{this, {is, some, {deeply, nested}, text}, for, you}";
while ($all=~s/{([^{}]*?)}/f($1)/seg) {}
sub f {return \{split(",",$_[0])};}
print @{$all};
我希望 $all 是一个 listref,其列表包含:
{this, [reference to array], for, you}
相反,@{$all} 是空的。
我确信这是基本的事情,但我做错了什么?
注意:我故意“打高尔夫球”将代码发布到此处(即显示问题的最少代码)。更广泛的版本位于:https://github.com/barrycarter/bcapps/blob/master/playground.pl https://github.com/barrycarter/bcapps/blob/master/playground.pl
编辑:感谢所有回答的人!笔记:
真正的 f() 有副作用,更新数据库等,所以我确实必须调用它。它不只是
将列表更改为其他内容。我很遗憾没有提到这一点。
我从 Mathematica 导出,所以“{a,b,c}”是一个列表,而不是一个
哈希。再次,我很抱歉没有提到这一点。
我知道执行此操作的“正常”方法是递归:处理每个
元素,如果元素是列表,则对列表本身调用 f()。我
试图“展开”递归以避免分裂嵌套
“{”。如果你从里到外地工作,你永远不必在什么时候数“{”
解析。
另一种有趣的应用程序是单行 XML 解析器(几乎)。
给 geekosaur 打勾以指出问题所在并
为什么我的方法可能是错误的。
我想我会尝试 Parser 方法,甚至 jrey 的 s/{/[ 方法。
你不能有$all
同时是您迭代匹配的字符串and收集迭代结果的 arrayref。$all
最终会变成类似字符串的东西"thisARRAY(0xdeadbeef)foryou"
, and @$all
会将其用作包符号名称,几乎可以肯定该名称未定义,因此它将自动生成为空列表。
此外,{}
已经是一个 (HASH
代替ARRAY
) 引用,因此您返回的是SCALAR
参考一个HASH
参考而不是ARRAY
ref 正如您显然所期望的那样。和{}
在正则表达式中是特殊的(foo{1,3}
表示重复 1 到 3 次foo
),所以你应该逃避它们。
正确的方法是收集到结果列表中,例如
my @res;
while ($all =~ /\G\{([^{}]*?)\}/sg) {
push @res, f($1);
}
use warnings
and use strict
会告诉你出了什么问题,即使不是具体是什么。使用它们。总是。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)