子例程在Perl中重新定义了错误 编辑:

子例程在Perl中重新定义了错误 编辑:,perl,Perl,每个模块的简要概述。我认为这是向我的帖子添加更多信息的正确方法。道歉,因为这是我第一次发帖 A.pm-包含可重复使用的例程,用于读取ZIP文件、解密内容、验证等,由各种CGI文件、命令行脚本和其他Perl模块使用 B.pm-这是一个Utils文件,它连接到DB,所有与SQLs相关的子例程,调用C.pm将标记写入每个文件 C.pm-用于标记ZIP中每个文件的专用例程,类似于校验和检查允许的文件类型、读取文件、写入文件、检查等,使用a.pm,因为模块需要解密内容,执行a.pm完成的验证 包括一些示例

每个模块的简要概述。我认为这是向我的帖子添加更多信息的正确方法。道歉,因为这是我第一次发帖

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在上述线程中对我的上述情况提出了非常好的建议。我不想避免这些警告,因为它们可能表明存在一些问题

非常感谢你的时间和帮助


感谢您,

循环使用通常不会给您一个重新定义的子例程警告,除非您直接执行其中一个包,而不是执行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'