与reftype {}有什么关系?

fri*_*edo 5 perl

我最近看到一些代码提醒我提出这个问题.最近,我看到了很多这样的事情:

use Scalar::Util 'reftype';

if ( reftype $some_ref eq reftype { } ) { ... }
Run Code Online (Sandbox Code Playgroud)

调用reftype匿名hashref 的目的是什么?为什么不说呢eq 'HASH'

Rob*_*t P 5

你现在可以将它与'HASH'进行比较,因为这就是现在的回归.

但它可能并不总是如此.

一个很好的例子是他们对编译的正则表达式所做的改变.在较旧的Perls中,reftype是SCALAR.但是,从5.12开始(我相信)它现在是它自己的类型REGEXP.例:

perl -MScalar::Util=reftype -e "print reftype qr//"在5.8给出SCALAR,但在5.12给出相同REGEXP.

你可以从我问过的这个问题中看到另一个应用程序,除了它用来ref代替reftype.原则是一样的.

简单地说,通过比较reftype {},他们guarenteeing,这正是现在和将来没有(我认为这是杀手级功能)硬编码又串到你的程序.

  • 做得非常好,谢谢.也许我会重新访问一些旧代码并添加一些Readonly常量,例如`$ HASH_TYPE = reftype {};` (2认同)
  • 你确定它不会改变Perl 6,它应该有Perl 5模式吗?此外,1,0,42等神奇值也不会改变.它仍然不意味着我们应该对它们进行硬编码,使得编译器无法捕获的错别字等等. (2认同)
  • 我认为这是最大的特色 - 你不能错过输入它."ARAAY"和"AARRY"和"ARRAY"一目了然看起来非常相似.测试将揭示问题,但测试问题仅仅是治愈疾病的方法.如果你可以通过做一些明显正确的事情来避免被感染,那么它就不会出错,你可以完全避免这个问题. (2认同)