我无意中在Perl 5.20中使用了Perl 5.14的实验autoderef功能,当然还收到有关其使用的警告。 diagnostics
编译指示解释了如果需要,如何抑制这些警告消息;但是,我想了解更多有关此警告的根本原因(实际上是整体功能),因此我转向perldoc
了解有关autoderef
的更多信息。
perldoc experimental
命令列出了autoderef
功能,其中包含有关其用途的高级声明,但仅此而已。
perldoc perlexperiment
命令提供了有关其他实验性功能的更多详细信息,但未提及autoderef
。
我尝试了其他各种perldoc
选项(例如-v
,-f
等),但无济于事。
使用warning
追踪此类diagnostics
/ 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
提供的语法和语义相匹配。
答案 0 :(得分:5)
当在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
,它必须包含对未经过处理的数组的引用。该参数将自动解除引用。push
的这一方面被认为是高度实验性的。在未来的Perl版本中,确切的行为可能会发生变化。
警告的原因记录在perl5200delta
:
“auto-deref”功能是实验性的。
从v5.14.0开始,不仅可以在聚合类型上使用push,pop,keys和其他内置函数,还可以使用它们的引用。该功能未部署到其原始预期规范,现在可能成为后缀解除引用的冗余。它一直被归类为实验性特征,并且在v5.20.0中也会发出警告。
实际上,perlexperiment
中提到了autoderef ,虽然它位于“数组和散列容器函数接受引用”标题下(perl5140delta
中使用的标题相同):
数组和哈希容器函数接受引用
在Perl 5.14.0中引入
此功能的票证是[perl#119437]。
如果您查看online documentation,则可以点击Perl问题跟踪器中issue #119437的链接,您可以在其中跟踪与该功能相关的开发详情。
如果您感到好奇,在下一个版本中看起来像autoderef is getting axed:
autoderef
功能已被删除实验
autoderef
功能(允许调用push
,pop
,shift
,unshift
,splice
,keys
,values
和each
关于标量参数)被认为是不成功的。它已被删除;尝试使用该功能(或禁用之前触发的experimental::autoderef
警告)现在会产生异常。