Можно ли читать __DATA__ с помощью Config :: General в Perl? - PullRequest
4 голосов
/ 04 января 2012

Я бы хотел настроить Config :: General для чтения из раздела __DATA__ скрипта вместо внешнего файла. (Я понимаю, что обычно это не так, но я хотел бы посмотреть, смогу ли я его запустить. Конкретный вариант использования - это то, что я могу отправить пример сценария другому разработчику, не отправляя отдельный файл конфигурации.)

В соответствии с perldoc perldata , $main::DATA должен действовать как действительный дескриптор файла. Я думаю, что Config :: General должен иметь возможность использовать -ConfigFile => \$FileHandle для его чтения, но у меня это не работает. Например, этот сценарий будет выполняться без сбоев, но __DATA__ не считывается.

#!/usr/bin/perl -w

use strict;
use Config::General;
use YAML::XS;

my $configObj = new Config::General(-ConfigFile => $main::DATA);

my %config_hash = $configObj->getall;

print Dump \%config_hash;

__DATA__

testKey = testValue

Я тоже пробовал:

my $configObj = new Config::General(-ConfigFile => \$main::DATA);

и

my $configObj = new Config::General(-ConfigFile => *main::DATA);

и несколько других вариантов, но ничего не получалось.

Можно ли использовать Config :: General для чтения ключа / значений конфигурации из __DATA__?

Ответы [ 3 ]

12 голосов
/ 04 января 2012

-ConfigFile требует ссылки на ручку. Это работает:

my $configObj = Config::General->new(
    -ConfigFile => \*main::DATA
);
4 голосов
/ 04 января 2012

Ручка DATA - это шар, а не скаляр.

Попробуйте *main::DATA вместо $main::DATA.

(и, возможно, попробуйте \*main::DATA. Из документов Config::General похоже, что вы должны передать аргумент дескриптора файла в качестве ссылки.)


Если аргумент -ConfigGeneral => filehandle для конструктора не соответствует вашим ожиданиям, альтернативой является

new Config::General( -String => join ("", <main::DATA>) );
1 голос
/ 04 января 2012

Это работает для меня:

#!/usr/bin/perl

use strict;
use warnings;
use Config::General;
use YAML::XS;

my $string;
{
    local $/;
    $string = <main::DATA>;
};
my $configObj = new Config::General(-String => $string);

my %config_hash = $configObj->getall;

use Data::Dumper;
warn Dumper(\%config_hash);

__DATA__

testKey = testValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...