子程序在Perl中重新定义了错误

时间:2011-02-24 20:05:18

标签: 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 / Apache迁移到LAMP时,会出现这些警告。

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

=====

您好,

我搜索了Stack Overflow,找到了我的问题的根本原因。

Perl - Subroutine redefined

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

包A - uses-> 包B - uses-> 包C - uses-> 套餐A

由于软件包C使用软件包A,显然我将重新定义子程序警告。但我的问题是,这样做是一种糟糕的编程习惯吗?最佳实践角度有哪些想法?

我无法避免这种引用,因为包C需要使用包A中定义的子例程。“Grant McLean”在上面的线程中有一个非常好的建议,用于我上面给出的情况。我不想避免这些警告,因为这些可能表明存在一些问题。

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

感谢你,

1 个答案:

答案 0 :(得分:4)

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

perl -c Foo.pm

相反,他们应该做

perl -e'use Foo'

那么你可以准确地分享你正在做什么来激发子程序重新定义的警告吗?