Perl-хэши: использование пар ключ / значение из внешнего текстового файла - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать хеш, который рисует свои пары ключ / значение из отдельного текстового файла на моем сервере.

Когда я вручную ввожу пары ключ / значение в хеш-код внутри моего perl-скрипта, как показано в примере ниже, хэш-функция отлично работает, когда я вызываю его позже:

# Initialize hash 
my %format_key = ('SGBK', 'PRINT', 'SGDVD', 'VIDEO');

# Call hash (this is much later in the program)
$item_format = $format_key{$fields[2]};

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

# Open file path saved in $format_key_file and save contents to $output
open(my $fh, '<', $format_key_file) or die "Could not read from $format_key_file, program halting."; {
 local $/;
 $output = <$fh>;
 }
 close($fh);

my %format_key = $output;

 # Call hash (this is much later in the program)
    $item_format = $format_key{$fields[2]};

Я в полном замешательстве.Я полагаю, что я могу просто вручную ввести все свои хеш-аргументы в сам скрипт, но их будет много, и я бы предпочел сохранить их в файле для простоты обновления в будущем.

1 Ответ

0 голосов
/ 17 января 2019

Когда вы читаете из файла, вы получаете строку (или несколько строк, если вы читаете построчно). Парсер Perl анализирует только исходный код, переданный интерпретатору Perl, а не все, что вы читаете из файлов или где-либо еще. Вы можете использовать функцию eval , чтобы вычислять произвольные строки, подобные этой, как код perl и возвращать результат последнего выражения (в данном случае, список строк), но строка eval опасна, потому что она может запустить любую код; если вы случайно прочитали файл, содержащий system 'rm -rf ~/*', у вас есть проблема.

Лучший вариант - хранить ваши данные в известном формате сериализации. Обычный формат, используемый для таких вещей: JSON , потому что он аккуратно отображается в структуры данных Perl, но вы также можете просто хранить свои строки в виде строк (без синтаксиса Perl, например, в кавычках) для простого случая, подобного этому. Существует множество других опций, таких как YAML или даже XML, но их сложнее декодировать; и двоичные форматы, такие как Storable, Sereal и CBOR, но они не читаются человеком, поэтому взаимодействовать с ними может только ваш код.

use strict;
use warnings;
use JSON::MaybeXS;
# if you store it as JSON: {"SGBK":"PRINT","SGDVD":"VIDEO"}
my %format_key = %{decode_json($output)};
# or from an even-sized array: ["SGBK","PRINT","SGDVD","VIDEO"]
my %format_key = @{decode_json($output)};

# if you store it as one value per line
my %format_key = split /\n/, $output;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...