Perl中的子例程重新定义错误

Ven*_*enu 2 perl

编辑:

每个模块的简要概述。(我认为这是向帖子中添加更多信息的正确方法。对不起,因为这是我第一次发布)

A.pm-包含可重用的例程,以读取ZIP文件,解密内容,进行验证等(由各种CGI文件,命令行脚本和其他Perl模块使用)

B.pm-这是Utils文件,它连接到DB,所有与SQL相关的子例程,并调用C.pm在每个文件中写入标记

C.pm-专门的例程,用于在ZIP中标记每个文件,类似于校验和(检查允许的文件类型,读取文件,写入文件,检查等),使用A.pm,因为该模块需要解密内容,执行验证通过A.pm

包括一些示例代码(我在这里只张贴了几行使用行;显然,.pm中使用了许多模块)

下午

package A;
use strict;
use warnings;
use B;
..........
B::get_database_information_for_file(..)
..........
sub validate_decrypted_mark { ...... }
sub decrypt_mark {..........} 
Run Code Online (Sandbox Code Playgroud)

.....

下午

package B;
use strict;
use warnings;
use C;
..........
C::mark_file(..)
..........
sub db_connect { ...... }
sub get_database_information_for_file {..........} 
Run Code Online (Sandbox Code Playgroud)

.....

下午

package C;
use strict;
use warnings;
use A;
..........
A::decrypt_mark(..)
..........
sub mark_file { ...... }
sub read_mark {..........} 
sub write_mark {..........} 
sub examine_mark {..........} 
Run Code Online (Sandbox Code Playgroud)

.....

很少有其他信息(可能有用)

  • 当我们最近从Solaris / Apache迁移到LAMP时,将显示这些警告。

  • 我们使用mod_perl,所以该模块可能已经在内存中了吗?

=====

你好,

我在Stack Overflow上进行了搜索,找到了导致此问题的根本原因。

Perl-重新定义子程序

但是我与上述线程中指定的情况不同。我的问题是,我在Perl中得到子例程重新定义的错误(与上述线程中指定的错误相同)。但是我的问题是关于循环参考和/或最佳实践的。我有以下情况,这导致子例程重新定义警告

软件包A --uses->软件包B --uses->软件包C --uses->软件包A

由于软件包C使用软件包A,显然我将重新定义子例程警告。但是我的问题是,这样做是不好的编程习惯吗?从最佳实践角度有什么想法?

我不能回避此引用,因为程序包C需要使用程序包A中定义的子例程。对于上述情况,“ Grant McLean”在上述线程中提出了很好的建议。我不想避免这些警告,因为这些警告可能表示一些问题。

非常感谢您的时间和帮助。

感谢您,

yst*_*sth 5

循环使用通常不应向您提供子例程重新定义的警告,除非您直接执行其中一个程序包而不执行使用/要求。有时人们尝试通过这种方式进行语法检查:

perl -c Foo.pm
Run Code Online (Sandbox Code Playgroud)

相反,他们应该做

perl -e'use Foo'
Run Code Online (Sandbox Code Playgroud)

那么,您是否可以准确地分享引发子例程重新定义警告的操作?