Предупреждающие сообщения с Locale :: Maketext :: Simple - PullRequest
3 голосов
/ 08 августа 2011

При запуске программы я получаю следующие предупреждающие сообщения:

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», но это не вариант ...

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Предупреждающие сообщения, которые вы видите, генерируются, когда переменная используется только один раз.Например:

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

См. perldiag для получения дополнительной информации.

Locale :: Maketext и I18N :: LangTags ::Определите, что использует тот же бит кода, что и обертка вокруг require Modulename, и именно этот код генерирует предупреждение.Основные Locale :: Maketext и I18N :: 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!

--

автономная версия Locale :: Maketext 1.19 включает этот патч.Однако автономная версия I18N :: LangTags :: Detect , по-видимому, не содержит патч.Я думаю , что это означает, что вам нужно обновить свою копию Perl, чтобы получить новейшее ядро ​​ I18N :: LangTags :: Detect .Может быть возможно обновить одноядерный модуль, но я не знаю достаточно об этом, чтобы сказать наверняка - эти вопросы могут помочь:

Как я могу безопасно скомпилировать модуль Perl 5.12 для Perl5.8.9?
Как мне установить модуль CPAN последней версии perl без установки нового perl?

1 голос
/ 23 августа 2011

Из вашего описания и ответа Майка кажется, что вы имеете дело с некоторыми новыми предупреждениями, появившимися в результате некоторых изменений в том, что представляет собой предупреждение "используется только один раз" в 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 голосов
/ 20 августа 2011

Ну, из информации, которую вы даете, трудно дать вам ответ.

Я бы рекомендовал использовать Locale :: Maketext over Locale :: Maketext :: Simple в любой день, если бы у меня был выбор. Но, конечно, я не уверен, что у тебя есть выбор. Не могли бы вы отредактировать ваше сообщение с полным кодом? Или большая часть вашего кода? Это очень поможет при ответе на этот вопрос.

...