有没有办法让Perl将数组引用的字符串化版本(例如ARRAY(0x8152c28))转换为实际的数组引用?
例如
perl -e 'use Data::Dumper; $a = [1,2,3];$b = $a; $a = $a.""; warn Dumper (Then some magic happens);'
Run Code Online (Sandbox Code Playgroud)
会屈服
$VAR1 = [
1,
2,
3
];
Run Code Online (Sandbox Code Playgroud) $all="{this, {is, some, {deeply, nested}, text}, for, you}";
while ($all=~s/{([^{}]*?)}/f($1)/seg) {}
sub f {return \{split(",",$_[0])};}
print @{$all};
Run Code Online (Sandbox Code Playgroud)
我希望$ all是一个listref,其列表包含:
{this, [reference to array], for, you}
Run Code Online (Sandbox Code Playgroud)
相反,@ {$ all}是空的.
我确信这是基本的,但我做错了什么?
注意:我有意"高举"代码在这里发布(即显示问题的最小代码).更广泛的版本是:https://github.com/barrycarter/bcapps/blob/master/playground.pl
编辑:感谢所有回答的人!笔记:
真正的f()有副作用,更新dbs等,所以我真的必须调用它.它不仅仅是将列表更改为其他内容.我不好意思没有提到这一点.
我从Mathematica导出所以"{a,b,c}"是一个列表,而不是哈希.再次,mea culpa没有提到这一点.
我知道执行此操作的"正常"方式是递归的:处理每个元素,如果元素是列表,则在列表本身上调用f().我试图"展开"递归以避免拆分嵌套的"{".如果你在里面工作,你就不必在解析时计算"{".
一个有趣的其他应用程序将是一个单行的XML解析器(差不多).
给geekosaur一个复选标记,指出哪里出错了,为什么我的方法可能是错误的.
我想我会尝试解析器方法,甚至是jrey的s/{/ [方法.
perl ×2