Скажем, у меня есть подпрограмма, которая получает два аргумента: спецификацию кодировки и путь к файлу. Затем подпрограмма использует эту информацию для открытия файла для чтения, как показано ниже, урезанного до самого необходимого:
run({
encoding => 'UTF-16---LE',
input_filename => 'test_file.txt',
});
sub run {
my $args = shift;
my ($enc, $fn) = @{ $args }{qw(encoding input_filename)};
my $is_ok = open my $in,
sprintf('<:encoding(%s)', $args->{encoding}),
$args->{input_filename}
;
}
Теперь это хрипит:
Не удается найти кодировку "UTF-16---LE" в E:\ Home\...
Какой правильныйспособ гарантировать, что $args->{encoding}
содержит правильную спецификацию кодирования перед интерполяцией во второй аргумент для открыть
?
Приведенная ниже информация предоставлена в надежде, что когда-нибудь она будет кому-то полезна. Я также собираюсь отправить отчет об ошибке.
В документах для Encode::Aliasвообще не упоминается find_alias
.Беглый взгляд на Encode/Alias.pm
в моей системе Windows показывает:
# Public, encouraged API is exported by default
our @EXPORT =
qw (
define_alias
find_alias
);
Однако примечание:
#!/usr/bin/env perl
use 5.014;
use Encode::Alias;
say find_alias('UTF-8')->name;
дает:
Использование неинициализированного значения $find in существует в C:/opt /Perl/lib/Encode/Alias.pm строка 25.
Использование неинициализированного значения $find в хэш-элементе C:/opt/Perl/lib/Encode/Alias.pm, строка 26.
Использование неинициализированного значения $find в сопоставлении с образцом (m//) в C:/opt/Perl/lib/Encode/Alias.pm, строка 31.
Использование неинициализированного значения $find в lc в C:/opt/Perl/lib/Encode/Alias.pm, строка 40.
Использование неинициализированного значения $find в сопоставлении с образцом (m//) в C:/opt/Perl/lib/Encode/Alias.pm, строка 31.
Использование неинициализированного значения $find в lc в C:/opt/Perl/lib/Encode/Alias.pm, строка 40.
Будучи 1) ленивым и 2) первым предположив, что я делаю что-то не так, я решил искать чужая мудрость.
В любом случае, ошибкасвязана с тем, что find_alias
экспортируется как функция без проверки в коде:
sub find_alias {
require Encode;
my $class = shift;
my $find = shift;
unless ( exists $Alias{$find} ) {
Если find_alias
не вызывается как метод, аргумент теперь находится в $class
, а $find
не определен.
ХТН.