2011-08-08 34 views
3

我得到這些警告消息,當我開始我的程序:警告信息與地點:: Maketext ::簡單

Name "AAT::Translation::I18N::en_us::Lexicon" used only once: possible typo at /usr/share/perl/5.12/Locale/Maketext.pm line 404. 
Name "Win32::Locale::Lexicon" used only once: possible typo at /usr/share/perl/5.12/I18N/LangTags/Detect.pm line 140. 

我的程序使用一個模塊Locale::Maketext::Simple

use Locale::Maketext::Simple(
    Path => '/usr/share/aat/Translations/' 
); 

這個目錄包含了我* .po文件(en.po,fr.po ...)

在使用Perl 5.12/Locale :: Maketext :: Simple 0.21 ...

之前,我沒有收到任何警告0

任何想法如何解決這個問題?

編輯1:完整的代碼

package AAT::Translation; 

use strict; 
use warnings; 
use Readonly; 

use AAT::Utils qw(NULL); 

my %AAT_Translation =(); 

use Locale::Maketext::Simple(
    Path => '/usr/share/aat/Translations/' 
); 

sub Init 
{ 
    my $lang = shift; 

    loc_lang($lang); 
    $AAT_Translation{$lang}{'_USER'} = loc("_USER"); 

    return (1); 
} 

sub Get 
{ 
    my ($lang, $str) = @_; 

    return (undef) if (NULL($str)); 
    Init($lang) if (!defined $AAT_Translation{$lang}{'_USER'}); 
    $AAT_Translation{$lang}{$str} = (loc($str) || $str) 
    if (!defined $AAT_Translation{$lang}{$str}); 

    return ($AAT_Translation{$lang}{$str}); 
} 

編輯2:當然,如果我創建一個鏈接en_us.po - > en.po,我不明白「AAT ::翻譯:: I18N :: en_us :: Lexicon「錯誤消息了,只有」Win32 :: Locale :: Lexicon「錯誤消息,但這不是一個選項...

+1

我只能從得到警告你的'use'與-W調用命令行(不-w)。你也一樣嗎? –

+1

@Richard:用Perl 5.10,我只用-W得到這些警告,用Perl 5.12,我用-w&-W得到這些警告-W – sebthebert

回答

0

那麼,從您提供的信息很難給你一個答案。

如果我有選擇,我會推薦在任何一天使用Locale::Maketext以上。但是,當然,我不確定你是否有選擇。你能否用你的完整代碼編輯你的文章?或者你的大部分代碼?回答這個問題會有很大的幫助。

+0

我剛剛編輯我的問題 – sebthebert

+0

@sebthebert:我很抱歉地說我不能告訴你什麼是錯的。我們最好的選擇是在http://www.perlmonks.org/發佈。 – Dynamic

2

您看到的警告消息是僅在使用一次變量時生成的。例如:

perl -w -e '$var = "value";' 
Name "main::var" used only once: possible typo at -e line 1. 

有關更多信息,請參閱perldiag

Locale::MaketextI18N::LangTags::Detect使用相同位代碼作爲圍繞require Modulename的包裝,並且它是生成警告的代碼。芯Locale::MaketextI18N::LangTags::Detect模塊固定用補丁v5.13.9-153-g364c63c - 參見no warnings 'once'行:

Summary of changes: 
dist/I18N-LangTags/lib/I18N/LangTags/Detect.pm | 1 + 
dist/Locale-Maketext/lib/Locale/Maketext.pm | 1 + 
2 files changed, 2 insertions(+), 0 deletions(-) 

diff --git a/dist/I18N-LangTags/lib/I18N/LangTags/Detect.pm b/dist/I18N-LangTags/lib/I18N/LangTags/Detect.pm 
index 87280b7..e767aac 100644 
--- a/dist/I18N-LangTags/lib/I18N/LangTags/Detect.pm 
+++ b/dist/I18N-LangTags/lib/I18N/LangTags/Detect.pm 
@@ -136,6 +136,7 @@ sub _try_use { # Basically a wrapper around "require Modulename" 

    my $module = $_[0]; # ASSUME sane module name! 
    { no strict 'refs'; 
+ no warnings 'once'; 
    return($tried{$module} = 1) 
     if %{$module . "::Lexicon"} or @{$module . "::ISA"}; 
    # weird case: we never use'd it, but there it is! 
diff --git a/dist/Locale-Maketext/lib/Locale/Maketext.pm b/dist/Locale-Maketext/lib/Locale/Maketext.pm 
index 042ecf7..b429778 100644 
--- a/dist/Locale-Maketext/lib/Locale/Maketext.pm 
+++ b/dist/Locale-Maketext/lib/Locale/Maketext.pm 
@@ -439,6 +439,7 @@ sub _try_use { # Basically a wrapper around "require Modulename" 

    my $module = $_[0]; # ASSUME sane module name! 
    { no strict 'refs'; 
+  no warnings 'once'; 
     return($tried{$module} = 1) 
     if %{$module . '::Lexicon'} or @{$module . '::ISA'}; 
     # weird case: we never use'd it, but there it is! 

-- 

standalone version of Locale::Maketext 1.19包括該補丁。但是,standalone version of I18N::LangTags::Detect似乎沒有包含該修補程序。我認爲,這意味着你需要升級你的Perl副本,以獲得最新的核心I18N::LangTags::Detect。它可能會更新單個核心模塊,但我不知道有足夠的瞭解它肯定地說 - 這些問題可能會有所幫助:

How can I safely compile a Perl 5.12 module for Perl 5.8.9?
How can I install a CPAN module that is in the latest perl, without installing the new perl?

1

從你的描述和邁克的回答,它聽起來像你正在處理一些新的警告,這些警告來自於在Perl中構成「僅使用一次」警告的某些更改。

缺少升級到未警告的模塊版本(如果它存在於您的perl版本中),您可以使特定問題警告消音。只需用下面的代碼替換在代碼中use Locale::...行:

BEGIN { 
    local $SIG{__WARN__} = sub { 
     warn @_ unless "@_" =~ /used only once/; 
    }; 
    require Locale::Maketext::Simple; 
    Locale::Maketext::Simple->import(
     Path => '/usr/share/aat/Translations/' 
    ); 
} 
+0

這是一個不錯的想法和我尋找的答案,但它不起作用! :( – sebthebert

+0

但它工作,如果我在$ SIG {__ WARN__}之前刪除'本地'... – sebthebert

+0

嗯,這意味着警告是在運行時拋出,而不是在編譯時拋出,如我所希望的。沒有進行本地化並不是最佳做法,因爲現在它會將所有「只使用一次」警告聲明,而不僅僅是來自Locale :: Maketext :: Simple的警告聲明,但如果充分記錄了它爲什麼存在並被移除一旦不再需要,它可以解決你的問題。 –