Как в Perl проверить допустимость кодировки, указанной в строке?

Скажем, у меня есть подпрограмма, которая получает два аргумента: спецификацию кодировки и путь к файлу. Затем подпрограмма использует эту информацию для открытия файла для чтения, как показано ниже, урезанного до самого необходимого:

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не определен.

ХТН.

10
задан Sinan Ünür 31 March 2012 в 14:27
поделиться