带有"use constant"的Perl Path :: Class :: file给出了祝福的ref,而不是string - 为什么?

kbr*_*bro -1 perl constants

在Ubuntu 14.04 LTS上运行Perl 5.18,我想创建一些路径名常量,所以我做了

use Path::Class;
use constant FILEPATH => file('directory', 'filename');
Run Code Online (Sandbox Code Playgroud)

但是,当我在哈希聚合中使用常量时......

my $hash = { filepath => FILEPATH };
use Data::Dumper;
print Dumper $href;
Run Code Online (Sandbox Code Playgroud)

...我惊讶地发现filepath密钥的值是一个有福的引用,而不是我期望的函数调用的字符串结果.

我可以解决这个问题...

use constant FILEPATH => file('directory', 'filename') . "";
Run Code Online (Sandbox Code Playgroud)

...迫使Perl解释器评估祝福的参考,但是

(a)有更好的方法,(b)到底发生了什么?!

我知道use constant在列表上下文中进行评估,但通常use constant MYCONST => mysub(arg1, arg2);做正确的事情,评估子例程调用并使用返回值.什么是聪明Path::Class::file才能打破这种期望?

sim*_*que 5

file来自模块Path :: Class函数实际上是Path :: Class对象的构造函数.它总是返回一个对象.甚至SYNOPSIS也这样说.

use Path::Class;

my $dir  = dir('foo', 'bar');       # Path::Class::Dir object
my $file = file('bob', 'file.txt'); # Path::Class::File object
Run Code Online (Sandbox Code Playgroud)

如果您想要的只是路径,请在返回值上调用该方法,并将该值file调用'返回值给您的常量.你得到的对象是Path :: Class :: File.它提供了各种方法.要像使用字符串重载一样,请调用stringify方法.

use constant FILEPATH => file('directory', 'filename')->stringify;
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 5

HTML :: Tiny的相关部分根据输入的类型决定要做什么.它需要undef一个字符串或一个数组引用,但你提供的东西不是这些.换句话说,这是GIGO的一个例子.您正在使用返回的值file(),这是一个重载字符串化的对象.

使用以下任一方法提供预期输入:

 use constant FILEPATH => file('directory', 'filename')->stringify;
Run Code Online (Sandbox Code Playgroud)

要么

 use constant FILEPATH => "".file('directory', 'filename');
Run Code Online (Sandbox Code Playgroud)

请注意,将对象用作常量是不安全的,因为它们不是常量.但是,由于file()返回一个不可变对象,将它用作常量是没有害处的,因为它确实是常量.