gpt4 book ai didi

perl - 如何伪造 perl 模块以进行依赖?

转载 作者:行者123 更新时间:2023-12-01 09:36:37 24 4
gpt4 key购买 nike

我正在使用的外部 Perl 库有一个依赖项 (DBD::mysql),我不会在我的应用程序 (DBD::SQLite) 中使用它,所以我希望系统只是假装存在依赖项,即使是“假的”。

我可以创建一个空的 DBD::mysql.pm 模块来编译还是有更直接的方法?

最佳答案

所以我认为这里的问题很少。

当您说依赖时,您的意思是外部模块只是尝试 requireuse DBD::mysql ?如果是这种情况,那么您应该建议开发人员不要明确地这样做,因为这违背了使用 DBI 的目的。 .应根据 DSN 动态选择数据库驱动程序。 .

假设作者只是使用包名,因为他认为这是一件有用或有意义的事情,那么是的,你可以覆盖那个包,并且有几种方法可以做到这一点。

正如你所建议的,你可以只创建你自己的模块 DBD/mysql.pm 来定义 DBD::mysql 包。

如果您有兴趣,还可以做一些其他事情。您只需让 Perl 相信该模块已加载,而不是在您的源代码树中乱扔假目录和文件。我们可以通过直接操作 %INC 来做到这一点。

package main;    # or whereever

BEGIN {
$INC{'DBD/mysql.pm'} = "nothing to see here";
}

只需添加此哈希键,我们就可以排除在文件系统中搜索违规模块的可能性。请注意,这是在 BEGIN block 中。如果外部作者执行了 use,那么我们必须在评估 use 语句之前填充此值。 use语句等效于包装在 BEGIN 中的 requireimport

现在让我们进一步推测外部作者试图调用包的方法。如果这些符号不存在,您将收到运行时错误。您可以利用 Perl 的 AUTOLOAD 来拦截此类调用并做正确的事情。 正确的事情可能会有很大的不同,从简单的记录消息到更复杂的事情。例如,您可以使用此工具通过监视所有调用来检查作者引入的耦合深度。

package DBD::mysql;

sub AUTOLOAD {
printf(
"I don't wanna '%s' called from '%s'\n", $AUTOLOAD, caller(0)
);
}

package main; # or whereever

BEGIN {
$INC{'DBD/mysql.pm'} = "nothing to see here";
}

DBD::mysql::blah()

现在让我们也讨论一下违规作者还创建了一些面向对象的类实例,而他的代码没有正确解释的情况为您的 stub 代码。我们将对我们假设为 new 的构造函数 stub ,以便用我们的包名来祝福匿名哈希。这样你就不会得到他在实例上调用方法时出错。

package DBD::mysql;

sub AUTOLOAD {
printf(
"I don't wanna '%s' called from '%s'\n", $AUTOLOAD, caller(0)
);
}

sub new {
bless({}, __PACKAGE__)
}

package main; # or whereever

BEGIN {
$INC{'DBD/mysql.pm'} = "nothing to see here";
}

my $thing = new DBD::mysql;

$thing->blah()

关于perl - 如何伪造 perl 模块以进行依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com