2011-02-24 43 views
1

编辑:

每个模块的简要概述。 (我假设这是正确的方式来添加更多的信息,我的帖子。道歉,因为这是我第一次发布)子程序重新定义了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 - Subroutine redefined

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

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

由于包C使用包A,显然我会重新定义子例程警告。但我的问题是,这是一种糟糕的编程习惯吗?最佳实践角度的想法是什么?

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

真的很感谢你的时间和帮助。

感谢你,

+2

我们需要查看更多的代码。我的猜测是,你在命名你的文件,但不是在顶部用'package xyz;'行来声明它们,所以你的所有子程序都被转储到'package main;'请寄出每个包的前几行包装声明(如果存在的话)以及任何'use' /'require'行) – 2011-02-24 20:29:09

+1

一般来说,如果您需要循环进口,您的设计会出现可怕的错误。 – geoffspear 2011-02-24 21:21:07

+0

谢谢Eric&Wooble的评论。我已经为您的评论添加了示例代码。 – Venu 2011-02-25 23:47:09

回答

3

循环利用,一般不应给你一个子程序重新定义警告,除非你直接执行包,而不是做使用一个/需要。有时候,人们试图做语法检查这样:

perl -c Foo.pm 

相反,他们应该做的

perl -e'use Foo' 

所以你能分享正是你在做什么,挑起子程序重新定义警告?

+1

谢谢@ysth您的关键点。我一直在做“perl -c Foo.pm”。这是当这些子程序重新定义的警告显示。 – Venu 2011-02-25 23:48:53