用Perl替换一个类(“覆盖”/“扩展”一个具有相同名称的类)?

时间:2014-07-13 19:22:37

标签: perl inheritance override

我正在尝试Iterate directories in Perl, getting introspectable objects as result,主要是因为当我在mtime的回复中使用Dumper时,我可以打印IO::All等字段。

我发现,如果在模块IO::All::File(对我来说,/usr/local/share/perl/5.10.1/IO/All/File.pm),我可以添加第field mtimef => undef;行,然后修改其{{1}所以它运行sub file(注意,此字段不能与相应的方法/属性具有相同的名称($self->mtimef($self->mtime);),因为它们是在mtime中动态分配的。所以,实质上,我对"重载"不感兴趣,因为多个功能签名具有相同的名称 - 我想要"替换"或"覆盖"一个具有扩展版本的类(不确定如何正确调用它),但名称相同;所以所有其他可以使用它的类,从那时起继续使用扩展版本。

现在对我来说最好的方法是,如果我能以某种方式"替换" IO::All课程,来自我的实际" runnable" Perl脚本 - 如果可能的话,通过使用继承机制,所以我可以添加什么是" extra"。为了说明我的意思,这是一个例子:

IO::All::File

...失败,并且#34;在包< IO :: All :: Filesys'中检测到递归继承在/usr/local/share/perl/5.10.1/IO/All/Base.pm第13行。&#34 ;;如果你注释掉了#34;递归继承"一节,一切正常。

我很清楚为什么会出现这种语法 - 然而,是否有一种语法或方法可用于替换"一个具有扩展版但名称相同的类,类似于我上面的尝试方式?显然,我想要相同的名称,这样我就不必更改use warnings; use strict; use Data::Dumper; my @targetDirsToScan = ("./"); use IO::All -utf8 ; # Turn on utf8 for all io # try to "replace" the IO::All::File class { # recursive inheritance! package IO::All::File; use IO::All::File -base; # hacks work if directly in /usr/local/share/perl/5.10.1/IO/All/File.pm field mtimef => undef; # hack sub file { my $self = shift; bless $self, __PACKAGE__; $self->name(shift) if @_; $self->mtimef($self->mtime); # hack return $self->_init; } 1; } # main script start my $io = io(@targetDirsToScan); my @contents = $io->all(0); # Get all contents of dir for my $contentry ( @contents ) { print Dumper \%{*$contentry}; } (或包中的任何其他文件)中的任何内容。另外,我最好在"跑步者" Perl脚本(这样我就可以在一个脚本文件中包含所有内容,而且我不需要维护多个文件) - 但如果唯一可行的方法是拥有一个单独的IO::All文件,我就会#39 ;我也想知道它。

那么,我可以使用这种技术吗?

1 个答案:

答案 0 :(得分:0)

好吧,老实说,我不知道发生了什么,但是我开始讨论上面的代码,似乎只需要从-base语句中移除use IO::All::File;而且代码似乎按照我的预期工作 - 也就是说,包 得到"覆盖" - 如果您在上面的代码中更改此代码段:

# ...
{ # no more recursive inheritance!? IO::All::File gets overriden with this?!
  package IO::All::File;
  use IO::All::File; # -base; # just do not use `-base` here?!

  # hacks work if directly in /usr/local/share/perl/5.10.1/IO/All/File.pm

  field mtimef => undef; # hack

  sub file {
    my $self = shift;
    bless $self, __PACKAGE__;
    $self->name(shift) if @_;
    $self->mtimef($self->mtime); # hack
    print("!! *haxx0rz'd* file() reporting in\n");
    return $self->_init;
  }

  1;
}
# ...

我发现这太难以置信了,我甚至在print()添加了... !! *haxx0rz'd* file() reporting in $VAR1 = { '_utf8' => 1, 'mtimef' => 1394828707, 'constructor' => sub { "DUMMY" }, 'is_open' => 0, 'io_handle' => undef, 'name' => './test.blg', '_encoding' => 'utf8', 'package' => 'IO::All' }; ... 以确保它是"覆盖"运行的功能,果然,它是;这就是我在输出中得到的结果:

:)

......果然,正如预期的那样,场地就在那里......

嗯 - 我希望有人最终在这里提出更合格的答案;目前,我希望这能解决我的问题{{1}} ......