在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才能打破这种期望?
file来自模块Path :: Class的函数实际上是Path :: Class对象的构造函数.它总是返回一个对象.甚至SYNOPSIS也这样说.
Run Code Online (Sandbox Code Playgroud)use Path::Class; my $dir = dir('foo', 'bar'); # Path::Class::Dir object my $file = file('bob', 'file.txt'); # Path::Class::File object
如果您想要的只是路径,请在返回值上调用该方法,并将该值file调用'返回值给您的常量.你得到的对象是Path :: Class :: File.它提供了各种方法.要像使用字符串重载一样,请调用stringify方法.
use constant FILEPATH => file('directory', 'filename')->stringify;
Run Code Online (Sandbox Code Playgroud)
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()返回一个不可变对象,将它用作常量是没有害处的,因为它确实是常量.
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |