Perl 结构流向 C
Perl structure flow to C
我已经开始使用 Perl 编写的程序并且必须转换为 C。
有很多子程序有结构成员访问,这对我来说是陌生的,因为我对 Perl 语法和结构流知之甚少。
示例:
$ref->{$struct2[$value]->{field1}}->{struct_insideStruct2}->{$ref2->{field}}
$ref 是第三个结构
$ref2 是 struct1 类型参数的本地副本
我的问题是:如何在 C 中创建这样的一行?
我需要创建嵌套的多个结构吗?
我需要了解 Perl 中的多重访问运算符是如何工作的,以及我是否可以在 C 中创建类似的东西,在此先感谢。
我建议不要尝试直接在语言之间进行翻译,因为这可能会导致代码笨拙且不自然。正如下面进一步评论的那样,这里肯定是这种情况。我能为这个任务做的最好的事情就是解释表达式的作用
$ref -> { $struct2[$value]->{field1} }
-> { struct_insideStruct2 }
-> { $ref2->{field} }
$ref
是一个reference to a hash (associative array); it's OK to think of it as a pointer to a hash. One can tell because the ->
("arrow") operator dereferences,它右边的{...}
表示它左边一定有hash引用;这个 returns 它指向的值。
在这种情况下,取消引用的键(关联数组的索引)涉及索引 $value
处数组 @struct2
的一个元素;该元素是另一个哈希引用,使用键 field1
取消引用(索引)(字符串文字†)。
这个 returns 是另一个哈希引用,然后用键 struct_insideStruct2
(字符串)索引(解除引用),这又是一个 returns 哈希引用。
最后一个索引是用一个键索引的,该键本身是通过取消引用另一个散列引用 $ref2
产生的,键是 field
(字符串)。
这是一个 Perl 示例 complex data structure。你喜欢吗?我没有,不是很多。即使在 Perl 中,理想情况下我也希望看到它被重写为 class,因为它太深太宽,所以它包含了太多的复杂性而没有任何 class 可以提供的支持结构。
如果您仍然希望在 C 中确实并且真的做那种事,您可以。可能想要找到一个好的散列实现(或使用 struct
s 并仔细嵌套它们),并且可能要清除函数指针语法等。但我建议不要陷入所有这些。
相反,一旦您理解了上面解释的 deep-nested 数据结构及其表示的数据,找到一种方法以原生 C 方式在您的代码中实现它的含义和作用。我们总是希望使用手头语言的逻辑、技术和习语。
除了链接文档外,还可以看到简短而有趣的 perlintro. The full reference for Perl's references is perlref。
† 通常这样的“裸词”需要在引号下,'string'
(或使用 ""
,或 q()
或 qq()
运营商...)。但如果那是 {}
之间唯一的事情,那么引号可以省略。
我已经开始使用 Perl 编写的程序并且必须转换为 C。
有很多子程序有结构成员访问,这对我来说是陌生的,因为我对 Perl 语法和结构流知之甚少。 示例:
$ref->{$struct2[$value]->{field1}}->{struct_insideStruct2}->{$ref2->{field}}
$ref 是第三个结构
$ref2 是 struct1 类型参数的本地副本
我的问题是:如何在 C 中创建这样的一行?
我需要创建嵌套的多个结构吗?
我需要了解 Perl 中的多重访问运算符是如何工作的,以及我是否可以在 C 中创建类似的东西,在此先感谢。
我建议不要尝试直接在语言之间进行翻译,因为这可能会导致代码笨拙且不自然。正如下面进一步评论的那样,这里肯定是这种情况。我能为这个任务做的最好的事情就是解释表达式的作用
$ref -> { $struct2[$value]->{field1} }
-> { struct_insideStruct2 }
-> { $ref2->{field} }
$ref
是一个reference to a hash (associative array); it's OK to think of it as a pointer to a hash. One can tell because the ->
("arrow") operator dereferences,它右边的{...}
表示它左边一定有hash引用;这个 returns 它指向的值。
在这种情况下,取消引用的键(关联数组的索引)涉及索引 $value
处数组 @struct2
的一个元素;该元素是另一个哈希引用,使用键 field1
取消引用(索引)(字符串文字†)。
这个 returns 是另一个哈希引用,然后用键 struct_insideStruct2
(字符串)索引(解除引用),这又是一个 returns 哈希引用。
最后一个索引是用一个键索引的,该键本身是通过取消引用另一个散列引用 $ref2
产生的,键是 field
(字符串)。
这是一个 Perl 示例 complex data structure。你喜欢吗?我没有,不是很多。即使在 Perl 中,理想情况下我也希望看到它被重写为 class,因为它太深太宽,所以它包含了太多的复杂性而没有任何 class 可以提供的支持结构。
如果您仍然希望在 C 中确实并且真的做那种事,您可以。可能想要找到一个好的散列实现(或使用 struct
s 并仔细嵌套它们),并且可能要清除函数指针语法等。但我建议不要陷入所有这些。
相反,一旦您理解了上面解释的 deep-nested 数据结构及其表示的数据,找到一种方法以原生 C 方式在您的代码中实现它的含义和作用。我们总是希望使用手头语言的逻辑、技术和习语。
除了链接文档外,还可以看到简短而有趣的 perlintro. The full reference for Perl's references is perlref。
† 通常这样的“裸词”需要在引号下,'string'
(或使用 ""
,或 q()
或 qq()
运营商...)。但如果那是 {}
之间唯一的事情,那么引号可以省略。