Perl:实验性特性和Perldoc

3
我在Perl 5.20中无意中使用了Perl 5.14的实验性autoderef功能,当然会收到有关其使用的警告。如果需要,diagnostics pragma可以解释如何抑制这些警告消息;但是,我想更多地了解这个警告的根本原因(以及整个功能),所以我转向perldoc来了解更多关于autoderef的信息。 perldoc experimental命令列出了autoderef功能及其目的的高级说明,但没有更多信息。 perldoc perlexperiment命令提供了其他实验性功能的更多详细信息,但未提到autoderef
我尝试了各种其他perldoc选项(例如,-v-f等),但都无济于事。
什么是使用perldoc回溯此类“警告”/“诊断”消息的有效方法?实验功能是否不包含在perldoc中?
更新:请参阅@ThisSuitIsBlackNot的优秀答案。
为了进一步澄清和参考:似乎autoderef命名空间没有贯穿所有各种文档(即perlexperiment,perldelta,perldoc等)。 perldoc experiment称其为autoderef,perldelta5140将其称为auto-deref。 perldoc perlexperiment使用了一些来自perldelta页面的语言,但没有使用autoderef或类似的内容。
自从 diagnostics 表示可以使用 no warnings "experimental::autoderef" 来抑制相关警告,将其作为 perldoc 的起点会很好。也就是说,使用 perldoc experimental::autoderef 查找与 diagnostics 和/或 warnings 提供的语法和语义匹配的相对文档。

3
过去遇到了一些问题后,决定新功能将经历一个被标记为实验的阶段,以便在发现问题时能够进行更改或删除,但不会改变其原意。 - ikegami
@ikegami 这部分非常清晰易懂。下面的答案提供了关于autoderef的许多细节。我问题的第二个更一般的部分是关于找到有关实验性功能的详细信息的困难。我已经更新了问题,更明确地表达了这个问题。 - secJ
1个回答

6
当Perl核心中添加或删除功能时,它们会在perldelta文档中记录,因此如果您收到有关某项功能实验性的警告,则可以在该文档中查找。
如果您知道该功能是在Perl 5.14.0中添加的:
perldoc perl5140delta

如果不行:
grep -lr autoderef $(dirname $(perldoc -l perldelta))

你链接到的 perl5140delta 中已有详细描述,但注意它列出了 autoderef 应用于的内置函数列表。运行 perldoc -f <function> 查看内置函数的文档,例如 perldoc -f push

从 Perl 5.14 开始,push 可以接受一个标量 EXPR,它必须持有对未 bless 的数组的引用。参数将自动解引用。这个特性被认为是高度实验性的。确切的行为在 Perl 的未来版本中可能会发生变化。

警告的原因在 perl5200delta 中有记录:

"autoderef" 特性是实验性的。

从 v5.14.0 开始,不仅可以在聚合类型上使用 push、pop、keys 和其他内置函数,还可以在对它们的引用上使用这些函数。该功能没有按照最初预期的规范部署,并且现在可能变得多余,与后缀解引用相比。它一直被归类为实验性功能,在 v5.20.0 中作为此类功能带有警告。

实际上,autoderef 在 perlexperiment 中确实有提到,尽管它在“数组和哈希容器函数接受引用”的标题下(与 perl5140delta 中使用的相同标题):
  • 数组和哈希容器函数接受引用

    从 Perl 5.14.0 开始引入

    此功能的票证是 [perl #119437]。

如果您查看在线文档,可以跟随链接转至 Perl 的问题跟踪器中的问题 #119437,其中可以关注与该功能相关的开发细节。
如果你好奇的话,看起来 autoderef 将在下一个版本中被删除:autoderef is getting axed自动解引用(autoderef)功能已被移除 实验性的自动解引用(autoderef)功能曾经允许在标量参数上调用push、pop、shift、unshift、splice、keys、values和each方法,但该功能并不成功。现已将其移除;尝试使用该功能(或禁用之前触发的experimental::autoderef警告)将会导致异常。

这是一个非常好的答案。我花了一些时间才找到perl5140delta页面讨论autoderef。我将把以下内容添加到问题中以供历史参考,但我很惊讶autoderef命名空间在所有各种文档(即perlexperimentperldeltaperldoc等)中都没有保持一致。找到它比我希望的要花更多的精力。由于diagnostics指出可以使用no warnings "experimental::autoderef"来抑制警告,我真的希望能够在perldoc experimental::autoderef中找到相关文档。 - secJ
perldoc是一个非常好的工具,但有时使用它就像进行一次寻宝游戏。在某些地方它被拼写为“autoderef”,而在其他地方则被拼写为“auto-deref”,这并没有帮助到我。我真的希望perldoc有全文搜索功能,但通常我只能通过在Google上搜索“perldoc foo”来解决问题。我不确定其他实验性特性的文档是否也很难找到,但如果是的话,可能值得在Perl5 porters邮件列表上提出建议。 - ThisSuitIsBlackNot
这是一个很好的建议。也许我会这样做。我通常只能访问本地的 perldoc,所以在它之外查找文档并不总是可行的。再次感谢你非常好的、周到的回复。 - secJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接