加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl:mocking -d -f和朋友.如何将它们放入CORE :: GLOBAL

发布时间:2020-12-15 21:41:29 所属栏目:大数据 来源:网络整理
导读:CORE文档告诉我如何快速模拟各种内置的Perl功能.但是,我并不确定如何替换’-d’和c.用我的方法所以这真的只是一个问题,我如何用CORE :: GLOBAL中的破折号替换一个函数. 手动参考将是不错的. package Testing::MockDir;use strict;use warnings;use Exporter(
CORE文档告诉我如何快速模拟各种内置的Perl功能.但是,我并不确定如何替换’-d’和c.用我的方法所以这真的只是一个问题,我如何用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;

解决方法

可能不可能 Overriding Built-in Functions上的 perlsub部分对于哪些功能可以被覆盖是模糊的. “很多”可以,“一些”不能,但除了少数例子之外,没有明确的清单.

通常我会试试这个:

{
    no strict 'refs';
    *{'CORE::GLOBAL::-d'} = &;Testing::MockDir::mock_d;
}

这不是语法错误,但没有覆盖-d的作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读