Perl:嘲笑 -d -f 和朋友.如何将它们放入 CORE::GLOBAL [英] Perl: mocking -d -f and friends. How to put them into CORE::GLOBAL
问题描述
CORE 文档向我展示了如何愉快地模拟各种已构建的 Perl 函数.但是,我不确定如何替换 '-d' &c.用我的方法.所以这实际上只是一个关于如何在 CORE::GLOBAL 中用破折号替换函数的问题.
The CORE documentation has shown me how to merrily mock various built Perl functions. However, I'm not really sure how to replace '-d' &c. with my methods. So this is really just a question on how do i replace a function with a dash in it in CORE::GLOBAL.
手动参考会很好.
package Testing::MockDir;
use strict;
use warnings;
use Exporter();
use Symbol 'qualify_to_ref';
*import = &Exporter::import;
our @EXPORT_OK = qw(SetMockDir UnsetMockDir);
our %EXPORT_TAGS = (
'all' => @EXPORT_OK,
);
my %path2List = ();
my %handle2List = ();
BEGIN {
*CORE::GLOBAL::opendir = &Testing::MockDir::opendir;
*CORE::GLOBAL::readdir = &Testing::MockDir::readdir;
*CORE::GLOBAL::closedir = &Testing::MockDir::closedir;
######################### the "-" is really the problem here
*CORE::GLOBAL::-d = &Testing::MockDir::mock_d; # This does not work <<<<<
}
sub mock_d ($) {
die 'It worked';
}
sub SetMockDir {
my ($path, @files) = @_;
$path2List{$path} = [@files];
}
sub UnsetMockDir {
my ($path) = @_;
delete $path2List{$path};
}
sub opendir (*$) {
my $handle = qualify_to_ref(shift, caller);
my ($path) = @_;
return CORE::opendir($handle, $path) unless defined $path2List{$path};
$handle2List{$handle} = $path2List{$path};
return 1;
}
sub readdir (*) {
my $handle = qualify_to_ref(shift, caller);
return CORE::readdir($handle) unless defined $handle2List{$handle};
return shift @{$handle2List{$handle}} unless wantarray;
my @files = @{$handle2List{$handle}};
$handle2List{$handle} = [];
return @files;
}
sub closedir (*) {
my $handle = qualify_to_ref(shift, caller);
return CORE::closedir($handle) unless defined $handle2List{$handle};
delete $handle2List{$handle};
return 1;
}
1;
推荐答案
这可能是不可能的.perlsub 部分在 覆盖内置函数对于哪些函数可以被覆盖是模糊的.很多"可以,一些"不能,但除了少数例子之外,没有明确的列表.
It may not be possible. The perlsub section on Overriding Built-in Functions is vague about which functions can be overridden. "Many" can, "some" can't, but aside from a handful of examples there's no definitive list.
通常,我会试试这个:
{
no strict 'refs';
*{'CORE::GLOBAL::-d'} = &Testing::MockDir::mock_d;
}
这不是语法错误,但没有覆盖 -d
的效果.
which isn't a syntax error, but doesn't have the effect of overriding -d
.
这篇关于Perl:嘲笑 -d -f 和朋友.如何将它们放入 CORE::GLOBAL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!