2011-02-24 75 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