编辑:
每个模块的简要概述。 (我假设这是正确的方式来添加更多的信息,我的帖子。道歉,因为这是我第一次发布)子程序重新定义了Perl中的错误
A.pm - 包含可重用的例程来读取ZIP文件,解密内容,验证等(由各种CGI文件,命令行脚本和其他Perl模块使用)
B.pm - 这是Utils文件,它连接到DB,所有与SQL相关的子例程,调用C. pm在每个文件中写入标记
C.pm - 在ZIP中标记类似于校验和的每个文件的特殊例程(检查允许的文件类型,读取文件,写入文件,检查等),使用A.pm因为模块需要解密内容,执行验证由A.pm
包括一些示例代码(我只是在这里发布几条使用线;显然很多模块,都在使用的.pm)
A.pm
package A;
use strict;
use warnings;
use B;
..........
B::get_database_information_for_file(..)
..........
sub validate_decrypted_mark { ...... }
sub decrypt_mark {..........}
.....
B.pm
package B;
use strict;
use warnings;
use C;
..........
C::mark_file(..)
..........
sub db_connect { ...... }
sub get_database_information_for_file {..........}
.....
C.pm
package C;
use strict;
use warnings;
use A;
..........
A::decrypt_mark(..)
..........
sub mark_file { ...... }
sub read_mark {..........}
sub write_mark {..........}
sub examine_mark {..........}
.....
很少有多个附加信息(这可能是有用的)
这些警告显示,当我们从最近的Solaris /阿帕奇搬到了LAMP。
我们使用mod_perl,所以有可能模块已经在内存中了?
=====
你好,
我搜索堆栈溢出,发现我的问题的根本原因。
但我有比上面线程指定一个不同的情况。我的问题是,我得到Perl中的子程序重新定义错误(与上述线程中指定的相同)。但我的问题在于循环参考和/或最佳实践。我有以下情形,这是导致子程序重新定义警告
套餐A --uses->套餐B --uses->套餐C --uses->套餐A
由于包C使用包A,显然我会重新定义子例程警告。但我的问题是,这是一种糟糕的编程习惯吗?最佳实践角度的想法是什么?
我无法避免这种引用,因为程序包C需要使用程序包A中定义的子程序。“Grant McLean”在上述线程中有一个很好的建议,用于我上面给出的情况。我不想避免这些警告,因为这些警告可能表明一些问题。
真的很感谢你的时间和帮助。
感谢你,
我们需要查看更多的代码。我的猜测是,你在命名你的文件,但不是在顶部用'package xyz;'行来声明它们,所以你的所有子程序都被转储到'package main;'请寄出每个包的前几行包装声明(如果存在的话)以及任何'use' /'require'行) – 2011-02-24 20:29:09
一般来说,如果您需要循环进口,您的设计会出现可怕的错误。 – geoffspear 2011-02-24 21:21:07
谢谢Eric&Wooble的评论。我已经为您的评论添加了示例代码。 – Venu 2011-02-25 23:47:09