通过一个 Perl 模块创建两个不同的对象

Creating two different objects through one Perl module

我正在编写允许用户创建 filedirectory 对象来操作文件系统的 Perl 模块。

示例:

use File;
use Dir;

my $file = File->new("path");
my $dir  = Dir ->new("path");

效果很好,但我真正希望能够同时创建 filedirectory 对象,而不必 use 两个单独的模块。


为此,我提出了以下解决方案...

IO.pm:

use File;
use Dir;

use Exporter qw(import);
our @EXPORT_OK = qw(file dir);

sub file {
    my $path = shift;
    return File->new($path);
}

sub dir {
    my $path = shift;
    return Dir->new($path);
}

1;

test.pl:

use IO qw(file dir);

my $file = file("path");
my $dir  = dir ("path");

现在问题来了,通过这样做,我消除了在用户创建 filedirectory 对象时对 new 的显式调用。我有点使用 filedir 子例程作为构造函数。

对我来说,这段代码看起来非常干净,而且使用起来非常简单,但我还没有看到很多其他人像这样编写 Perl 代码,所以我想我至少应该提出这个问题:

像这样简单地从子例程中 return 一个对象是否可以,或者这是否尖叫不好的做法?

完全没问题。

例如,Path::Class 的 filedir 函数 return Path::Class::File 和 Path::Class::Dir 对象分别

如果那是 class 提供的唯一构造函数,它将阻止(干净)subclassing,但这里不是这种情况。


但是有一个问题是要不要更换

open(my $fh, "path");
opendir(my $dh, "path);

my $fh = file("path");
my $dh = dir("path);

是否有利(假设函数return IO::File和IO::Dir对象)。