gpt4 book ai didi

Perl:从里到外展开列表不起作用?

转载 作者:行者123 更新时间:2023-12-02 07:47:44 26 4
gpt4 key购买 nike

$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

编辑:感谢所有回答的人!备注:

  • 真正的 f() 有副作用,更新数据库等,所以我确实必须调用它。它不只是将列表更改为其他内容。我很遗憾没有提到这一点。

  • 我从 Mathematica 导出,因此“{a,b,c}”是一个列表,而不是一个哈希。再次,我很抱歉没有提到这一点。

  • 我知道执行此操作的“正常”方法是递归:处理每个元素,如果元素是列表,则对列表本身调用 f()。我试图“展开”递归以避免 split 嵌套“{”。如果你从里到外地工作,你永远不必在什么时候数“{”解析。

  • 另一个有趣的应用程序是单行 XML 解析器(几乎)。

  • 给 geekosaur 打勾以指出问题所在并为什么我的方法可能是错误的。

  • 我想我会尝试 Parser 方法,甚至 jrey 的 s/{/[ 方法。

最佳答案

您不能让 $all 同时成为您迭代匹配的字符串收集迭代结果的 arrayref。 $all 最终将成为类似于字符串 "thisARRAY(0xdeadbeef)foryou",并且 @$all 将使用它作为包符号name,几乎肯定没有定义,所以它会自动生成一个空列表。

此外,{} 已经是一个(HASH 而不是 ARRAY)引用,因此您将返回一个 SCALAR 引用为 HASH 引用,而不是您显然期望的 ARRAY 引用。而且 {} 在正则表达式中比较特殊(foo{1,3} 表示 1 到 3 次重复 foo),因此您应该转义它们。

正确的方法是收集到结果列表中,例如

my @res;
while ($all =~ /\G\{([^{}]*?)\}/sg) {
push @res, f($1);
}

use warningsuse strict 会告诉您出现了问题,即使不准确是什么。使用它们。永远。

关于Perl:从里到外展开列表不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5759597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com