启动程序时收到以下警告消息:

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 :: Translation :: I18N :: en_us :: Lexicon”错误消息,而只会出现“ Win32 :: Locale :: Lexicon”错误消息,但这不是一个选择...

最佳答案

当变量仅使用一次时,将生成警告消息。例如:

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似乎没有包含补丁。我认为这意味着您需要升级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?

10-04 11:02
查看更多