3

我无意中在 Perl 5.20 中使用了 Perl 5.14 的实验性autoderef功能,当然也收到了有关其使用的警告。diagnosticspragma 解释了如何在需要时抑制这些警告消息;但是,我想更多地了解这个警告的根本原因(以及整个特性),所以我转向perldoc了解更多关于autoderef.

perldoc experimental命令列出了该autoderef功能,并对其目的进行了高级说明,但仅此而已。

perldoc perlexperiment命令提供了有关其他实验功能的更多详细信息,但autoderef根本没有提及。

我尝试了各种其他perldoc选项(例如,,-v-f),但无济于事。

warning使用 回溯此类/diagnostics消息的有效方法是什么perldoc?实验性功能不包括在 中perldoc吗?

更新:请参阅下面的@ThisSuitIsBlackNot 的优秀答案。

autoderef为了进一步清晰和参考:命名空间并未贯穿所有各种文档(即perlexperiment,perldelta等)似乎很奇怪perldocperldoc experiment叫它autoderefperldelta5140简称它auto-derefperldoc perlexperiment使用了perldelta页面中的一些语言,但不是autoderef或类似的。

既然diagnostics声明了相关的警告,可以使用no warnings "experimental::autoderef". 将其用作perldoc. 也就是说,找到与和/或perldoc experimental::autoderef提供的语法和语义相匹配的相关文档。diagnosticswarnings

4

1 回答 1

6

当特性被添加到 Perl 核心或从 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可以采用 scalar EXPR,它必须包含对 unblessed 数组的引用。该参数将被自动取消引用。这方面push被认为是高度实验性的。在 Perl 的未来版本中,确切的行为可能会改变。

警告的原因记录在perl5200delta

“自动取消引用”功能是实验性的。

从 v5.14.0 开始,不仅可以在聚合类型上使用 push、pop、keys 和其他内置函数,还可以在对它们的引用上使用。该功能未部署到其最初的预期规范,现在可能成为后缀取消引用的冗余。它一直被归类为实验性功能,并且在 v5.20.0 中带有这样的警告。

实际上,autoderef在 中提及perlexperiment,尽管它位于“数组和散列容器函数接受引用”标题下(与 中使用的标题相同perl5140delta):

  • 数组和散列容器函数接受引用

    在 Perl 5.14.0 中引入

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

如果您查看在线文档,您可以点击链接到Perl 的问题跟踪器中的问题 #119437 ,您可以在其中关注与该功能相关的开发细节。


如果你很好奇,看起来autoderef 会在下一个版本中被取消:

autoderef功能已被删除

实验性autoderef功能(允许在标量参数上调用push, pop, shift, unshift, splice, keys,valueseach)被认为是不成功的。它现在已被删除;尝试使用该功能(或禁用experimental::autoderef之前触发的警告)现在会产生异常。

于 2015-07-17T01:53:13.073 回答