首页 > 解决方案 > Perl 结构流向 C

问题描述

我已经开始在 Perl 中编写一个程序,并且必须将其转换为 C。

有很多子程序可以访问结构成员,这对我来说是不熟悉的,因为我对 Perl 语法和结构流几乎一无所知。例子:

$ref->{$struct2[$value]->{field1}}->{struct_insideStruct2}->{$ref2->{field}}

$ref 是第三种结构

$ref2 是 struct1 类型的参数的本地副本

我的问题是:如何在 C 中创建这样的行?

我需要创建嵌套的多个结构吗?

我需要了解 Perl 中的多访问运算符是如何工作的,以及我是否可以在 C 中创建类似的东西,在此先感谢。

标签: cperldata-structures

解决方案


我建议不要尝试直接在语言之间进行翻译,因为这可能会导致代码笨拙且不自然。正如下面进一步评论的那样,这里肯定会出现这种情况。我能为这个任务做的最好的就是解释这个表达式的作用

$ref -> { $struct2[$value]->{field1} }
     -> { struct_insideStruct2 }
     -> { $ref2->{field} }

$ref是对哈希(关联数组)的引用;可以将其视为指向哈希的指针。可以看出,因为("arrow") 运算符取消引用,而其右侧的 表示其左侧必须有一个哈希引用;这返回一个它指向的值。->{...}

@struct2在这种情况下,取消引用它的键(关联数组的索引)涉及索引处的数组元素$value;该元素是另一个哈希引用,使用键field1(字符串文字†</sup>)取消引用(索引到)。

这返回的是另一个哈希引用,然后使用键struct_insideStruct2(字符串)将其索引到(取消引用),这又返回一个哈希引用。

最后一个用一个键索引,该键本身是通过$ref2用一个键field(字符串)取消引用另一个散列引用产生的。

这是一个 Perl复杂数据结构的例子。你喜欢吗?我不,不是很多。即使在 Perl 中,理想情况下我也希望看到它被重写为一个类,因为它太深太宽,因此它包含了太多的复杂性,而没有任何类可以提供的支持结构。

如果你仍然希望确实并且真的在 C 中做那种事情,你可以. 可能想找到一个好的散列实现(或使用structs 并小心地嵌套它们),并且可能想清除你的函数指针语法等。但我建议不要参与所有这些。

相反,一旦你理解了上面解释的深层嵌套数据结构,以及它所代表的数据,就可以找到一种方法来以原生 C 方式在你的代码中实现它的含义和作用。我们总是想使用手头语言的逻辑、技术和习语。

除了链接的文档,还可以看到简短而甜蜜的perlintro。Perl 参考资料的完整参考资料是perlref


†</sup> 通常这样的“裸词”需要在引号下,'string'(或使用"",或q()qq()运算符...)。但是,如果这是唯一的事情,{}那么可以省略引用。


推荐阅读