gpt4 book ai didi

raku - Perl6 : getting array ref for Perl5 Module

转载 作者:行者123 更新时间:2023-12-04 13:36:11 25 4
gpt4 key购买 nike

我正在尝试使用Excel::Writer::XLSX在Perl6中编写一个Excel笔记本。

我正在通过use Excel::Writer::XLSX:from<Perl5>使用Inline::Perl5

具体来说,我想像在Perl5中一样写一行:

$worksheet -> write_row(0,0, \@line);

但这给出了错误

To pass an array, hash or sub to a function in Perl 6, just pass it as is. For other uses of Perl 5's ref operator consider binding with ::= instead. Parenthesize as (...) if you intended a capture of a single variable.



所以我尝试advice1:
$worksheet.write_row(0,0, @line)
这给出了错误

Not an array ref in call to write_row() at -e line 0.



建议2:
$worksheet.write_row(0,0, ::=@line);

Not an array ref in call to write_row() at -e line 0.


$worksheet.write_row(0,0, (@line));

给出相同的错误。

如何在Perl6中使用Excel::Writer::XLSX将数组写入行?

最佳答案

解决方案是编写$@array而不是\@array:

$worksheet.write_row(0,0, $@line)

该答案的其余部分是有关使用已安装的外语适配器编写代码以及处理出现的任何问题的简要指南。我打算将其用作一般资源,其答案远远超出了这个特定问题。

它以明显的问题“为什么要使用 $@foo?”开头,讨论了如何成功使用外语适配器,并通过解释警告消息为何无用而结束。

为什么是 $@foo

编写 $@foo以将 @foo作为对P5的数组引用进行传递,是对现有P6功能的简单自然使用。

也就是说,用户不需要了解P6的 $功能,也不需要知道 Inline::Perl5如何使用它来完成他们想要做的事情(编写将数组引用传递给P5的函数​​的P6代码)模块)。

因此,“为什么要使用 $@foo?”的主要答案是是您以这种方式编写它并且可以正常工作。\o/

人们应该如何知道魔法咒语?

我得到了从 Inline::Perl5's README传递数组引用的解决方案:

HASH and ARRAY references are made automatically if the Perl 6 objects are containerized:


$p5obj.takes-an-array:      [<a b c>];
$p5obj.takes-an-array-ref: $[<a b c>];

(“容器化”一词指的是P6概念,lizmat为在 Containers in P6文章中了解P5的人很好地解释了这个问题。但是容器技术实际上与 $@foo在使用 Inline::Perl5时为何在P5中表示数组ref无关。不,不一定要那样。)

为什么P6中的 $@foo表示P5中的数组引用?

编写 $@foo是正确的事情的原因并不是因为P6语言或编译器认为是正确的。

这是一个适当的P6功能,但是要做正确的原因是niner( Inline::Perl5的作者)这样说。

niner为什么选择 $@foo

大概是因为:
  • 对于新手来说很容易编写;
  • 当有人认识P6时,就可以达到这个目的。
  • 易于niner记录;
  • 易于以高性能的方式将其P6含义(Array中的Scalar)转换为目标P5含义(P5数组引用)。

  • 使用外语适配器时会发生什么
    Inline::Perl5是几种 foreign language adaptors之一。这些适配器允许P6代码嵌入以那些外语编写的代码和/或使用以那些外语编写的模块。

    当Rakudo P6编译器在 :from<Perl5>语句中看到 use时,它将隐式调用以前安装的称为 Inline::Perl5的P6模块。
    Inline::Perl5安装 marshaling代码,该代码会自动将P6代码与P5代码之间进行映射,以便P6和P5能够以最小的麻烦工作。

    理想情况下,适配器只能完成其工作,而您不必考虑它们。但:
  • 虽然将P6中的42映射到任何和所有外语的显而易见的事情是它们的值表示整数42,但对于更高级别的数据结构,函数,引用等,映射并不总是那么简单。有时这是令人惊奇的编写P6代码可以做什么(您可以创建一个P6类,它是P5类的子类,完全可以像编写普通P6代码一样编写它!),但是有时您必须遵循规则(在这种情况下)如何将P6数组传递给P5作为数组引用)。请参阅下面的适配器文档部分。
  • P6语言和编译器不知道映射正在进行。因此,它们显示的任何错误或警告消息都可能无济于事,甚至会引起误解。另外,适配器错误与P6,其编译器和所使用的外语模块中的错误是分开的。请参阅下面的警告和错误部分。

  • 进行外语适配器实现的自动映射远非自动化。有才华的开发人员必须编写适配器代码,以处理所有数据,异常等的编码(marshal)处理。

    给定足够的耗时(年),如果您只想在P6中使用该语言的模块或代码,则适配器可能无需考虑适配器的存在。您只需要使用它,它就始终可以像使用外语一样工作。

    对您,亲爱的读者以及我们所有人来说,更快地实现这一理想的一种方法是通过现有适配器使用外部模块,并在某些特定功能似乎无法正常工作时编写SO问题和文件问题。谢谢@ con,niner,以及其他实现此目标的人。

    适配器文档

    确定要使用 :from<...>使用的外语模块应该编写哪种P6代码的唯一方法是:
  • 阅读外语模块的文档以查看期望的内容。然后
  • 阅读适配器的文档,以了解如何编写相应的P6代码,从而为外语和外语模块提供所需的内容。

  • 在这种情况下,我们正在谈论 :from<Perl5>的使用,适配器是 Inline::Perl5。其文档当前为 its github project repo README。因此,要查看为满足P5和P5模块的期望而应该编写的内容,请阅读该文档。

    每个适配器都有其自己的文档;请参阅 modules.perl6.org上的链接列表。

    警告和错误

    如果在P6中使用外语模块时出现任何问题(当直接在该外语中使用相同的代码时也没有错),则:
  • 确保您已经阅读了相关的适配器文档;
  • 如果收到警告或错误消息,请确保引用适配器的文档及其问题队列,以了解它是否对该特定消息有所帮助;
  • 如果您认为使用外语模块在P6中工作(或不工作)时存在错误(直接在该外语中使用会很好),请参阅适配器的发布队列。例如,如果您使用的是:from<Perl5>,请引用 Inline::Perl5 's issue queue。如果您决定发布某些内容,则可以在不确定的情况下在此处发布,或者在适配器的发布队列中进行发布。

  • 由于P6语言和编译器不知道映射正在进行,因此在学习使用涉及以下规则(例如此SO的 $@foo规则)的外语适配器的任何方面时,警告和错误消息可能会产生误导。

    对于P5问题,P6可能会加剧这种情况,因为P6试图对编写P6代码的P5编码人员有所帮助,并在使用 Inline::Perl5时尝试回火。问题中的示例是一个很好的示例:
    To pass an array, hash or sub to a function in Perl 6, just pass it as is.

    P6认为您可能习惯于使用前缀 \编写数组引用。它认为您可能不知道不需要在P6中写斜杠。它没有意识到您要坚持要获得P5通过 Inline::Perl5可以理解的数组引用。
    For other uses of Perl 5's ref operator consider binding with ::= instead.

    P6认为您正在尝试使用 \完成P5中的操作,不是因为您想使用P5,而是因为您知道P5,想在P6中完成某些事情而不涉及P5,并且希望语法完全相同。

    (顺便说一句, ::=建议肯定无济于事-因为 ::=尚未实现!)
    Parenthesize as (...) if you intended a capture of a single variable.

    P6并不认为您正在尝试使P5函数与数组引用一起使用。它认为您正在尝试创建P6 Capture

    它的建议应被解释为建议您编写 \(@foo)而不是 \@foo来创建包含 Capture@foo

    它警告使用 \@foo来表示 Capture正是因为P5开发人员可能会写它以为会创建数组引用。

    总之,P6不知道 Inline::Perl5存在,或者它将对您的代码做任何事情。相反,它的建议是尝试将它认为您正在使用的P5语法和概念转换为P6中的相应语法和概念。这并不是尝试建议如何通过 Inline::Perl5编写适合于映射到P5的P6代码。

    综上所述,我想适配器开发人员和核心P6开发人员有一天可能会根据诸如此类SO提出的可用性问题来修改与P5相关的警告和错误消息。

    关于raku - Perl6 : getting array ref for Perl5 Module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54751328/

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