我正在尝试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 ;我也想知道它。
那么,我可以使用这种技术吗?
答案 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}} ......