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

时间:2016-10-19 16:18:34

标签: perl oop object module subroutine

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

示例:

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");

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

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

是否可以简单地从这样的子程序中返回一个对象,或者这是不是很糟糕的做法?

1 个答案:

答案 0 :(得分:3)

这很好。

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

如果那是该类提供的唯一构造函数,它将阻止(清理)子类化,但这不是这种情况。

然而,是否有替换

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

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

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