我启动程序时收到这些警告消息:
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”错误消息,但这不是一个选项......
答案 0 :(得分:2)
当变量仅使用一次时,会生成您看到的警告消息。例如:
perl -w -e '$var = "value";'
Name "main::var" used only once: possible typo at -e line 1.
有关详细信息,请参阅perldiag。
Locale::Maketext和I18N::LangTags::Detect使用相同的代码作为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!
--
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 :(得分: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/'
);
}
答案 2 :(得分:0)
嗯,从您提供的信息来看,很难给出答案。
如果我有选择的话,我建议您每天Locale::Maketext使用Locale::Maketext::Simple。但是,当然,我不确定你是否有选择权。你可以用你的完整代码编辑你的帖子吗?或者你的大部分代码?回答这个问题会有很大帮助。