2011-08-08 4 views
3

내가 내 프로그램을 시작할 때 나는 이러한 경고 메시지를 얻을 :경고 메시지 :: 간단한

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 ...

어떤 아이디어를 고칠 수 있습니까?

편집 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

을 나는 단지에서 경고를받을 수있는'-W 콜 use' 명령 줄에서 (-w되지 않음). 너도 똑같은거야? –

+1

@ 리차드 : Perl 5.10에서는 Perl 5.12와 함께 -W로 경고 만받습니다. -w & -W로 경고합니다. – sebthebert

답변

0

글쎄, 당신이주는 정보에서, 그것 당신에게 대답을하기가 어렵습니다.

나는 선택의 여지가 있다면 언제든지 Locale::Maketext::Simple보다 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::Detectrequire 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에는 패치가 포함되어 있지 않습니다. I 은 최신 코어 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의 경고뿐만 아니라 모든 '한번 사용 된 경고'경고를 묵음으로 처리 할 것이기 때문에 현지화하지 않는 것이 가장 좋은 방법은 아닙니다. 그러나 왜 그것이 제 위치에 있는지 적절하게 문서화되어 제거 된 경우 더 이상 필요하지 않으면 문제를 해결할 수 있습니다. –

관련 문제