子例程在Perl中重新定义了错误 编辑:
每个模块的简要概述。我认为这是向我的帖子添加更多信息的正确方法。道歉,因为这是我第一次发帖 A.pm-包含可重复使用的例程,用于读取ZIP文件、解密内容、验证等,由各种CGI文件、命令行脚本和其他Perl模块使用 B.pm-这是一个Utils文件,它连接到DB,所有与SQLs相关的子例程,调用C.pm将标记写入每个文件 C.pm-用于标记ZIP中每个文件的专用例程,类似于校验和检查允许的文件类型、读取文件、写入文件、检查等,使用a.pm,因为模块需要解密内容,执行a.pm完成的验证 包括一些示例代码,我只是在这里发布了一些使用行;显然,在.pm中使用了很多模块 上午 下午二点 下午三点 没有更多有用的附加信息 当我们最近从Solaris/Apache迁移到LAMP时,就会出现这些警告 我们使用mod_perl,所以模块可能已经在内存中了 ===== 你好, 我已经搜索了堆栈溢出并找到了问题的根本原因 但我有一个不同的情况比一个指定在上面的线程。我的问题是,我在Perl中得到的子例程重定义错误与上面线程中指定的错误相同。但我的问题是关于循环参考和/或最佳实践。我有下面的场景,这将导致子例程重新定义警告 包A-使用->包B-使用->包C-使用->包A 由于包C使用包A,显然我将重新定义子例程warning。但我的问题是,这样做是一种糟糕的编程实践吗?从最佳实践的角度来看,您的想法是什么 我无法避免这种引用,因为包C需要使用包A中定义的子例程。Grant McLean在上述线程中对我的上述情况提出了非常好的建议。我不想避免这些警告,因为它们可能表明存在一些问题 非常感谢你的时间和帮助子例程在Perl中重新定义了错误 编辑:,perl,Perl,每个模块的简要概述。我认为这是向我的帖子添加更多信息的正确方法。道歉,因为这是我第一次发帖 A.pm-包含可重复使用的例程,用于读取ZIP文件、解密内容、验证等,由各种CGI文件、命令行脚本和其他Perl模块使用 B.pm-这是一个Utils文件,它连接到DB,所有与SQLs相关的子例程,调用C.pm将标记写入每个文件 C.pm-用于标记ZIP中每个文件的专用例程,类似于校验和检查允许的文件类型、读取文件、写入文件、检查等,使用a.pm,因为模块需要解密内容,执行a.pm完成的验证 包括一些示例
感谢您,循环使用通常不会给您一个重新定义的子例程警告,除非您直接执行其中一个包,而不是执行use/require。有时,人们尝试以这种方式进行语法检查:
perl -c Foo.pm
相反,他们应该这样做
perl -e'use Foo'
因此,您能否准确地分享您正在做什么来引发子例程重新定义的警告?我们需要了解更多您的代码。我的猜测是,您正在命名您的文件,但没有用包xyz声明它们;行,因此所有子例程都被转储到主包中;请张贴每个包装的前几行、包装声明(如有)以及任何使用/要求行。一般来说,如果您需要循环导入,则说明您的设计存在严重错误。谢谢Eric&Wooble的评论。我已经添加了示例代码供您审阅。感谢@ysth提供您的要点。我一直在做perl-cfoo.pm。此时将显示这些重新定义的子例程警告。
package C;
use strict;
use warnings;
use A;
..........
A::decrypt_mark(..)
..........
sub mark_file { ...... }
sub read_mark {..........}
sub write_mark {..........}
sub examine_mark {..........}
perl -c Foo.pm
perl -e'use Foo'