Скажем, у меня есть подпрограмма, которая получает два аргумента: спецификацию кодировки и путь к файлу. Подпрограмма затем использует эту информацию, чтобы открыть файл для чтения, как показано ниже, в упрощенном виде:
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}
;
}
Теперь, это квакает с:
Cannot find encoding "UTF-16---LE" at E:\Home\...
Каков правильный способ гарантировать, что $args->{encoding}
содержит действительную спецификацию кодирования перед интерполяцией во второй аргумент open
?
Обновление
Информация ниже предоставлена в надежде, что она будет кому-то полезна в какой-то момент. Я также собираюсь подать отчет об ошибке .
Документы для 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;
Выходы:
Use of uninitialized value $find in exists at C:/opt/Perl/lib/Encode/Alias.pm line 25.
Use of uninitialized value $find in hash element at C:/opt/Perl/lib/Encode/Alias.pm line 26.
Use of uninitialized value $find in pattern match (m//) at C:/opt/Perl/lib/Encode/Alias.pm line 31.
Use of uninitialized value $find in lc at C:/opt/Perl/lib/Encode/Alias.pm line 40.
Use of uninitialized value $find in pattern match (m//) at C:/opt/Perl/lib/Encode/Alias.pm line 31.
Use of uninitialized value $find in lc at C:/opt/Perl/lib/Encode/Alias.pm line 40.
Будучи 1) ленивым и 2) сначала предположив, что я делаю что-то не так, я решил искать мудрости других.
В любом случае, ошибка связана с тем, что find_alias
экспортируется как функция без проверки в коде:
sub find_alias {
require Encode;
my $class = shift;
my $find = shift;
unless ( exists $Alias{$find} ) {
Если find_alias
не вызывается как метод, аргумент теперь находится в $class
, а $find
не определен.
НТН.