Nano Hash - криптовалюты, майнинг, программирование

Хэши Perl: использование пар ключ/значение из внешнего текстового файла

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

Когда я вручную ввожу пары ключ/значение в хэш внутри моего 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]};

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

16.01.2019

  • $output — это строка со всем файлом (даже включая новые строки). Это не сделает %format_key очень счастливым и отличается от того, что вы делаете вручную. Каков формат файла? 17.01.2019
  • Если вы можете выбрать, в каком формате хранить эти вещи в файле, см. Ответ @Grinnz для некоторых вариантов, где наиболее разумные представлены в примере кода. Но если файл дан, то мой вопрос выше остается в силе: каков формат этого файла? (Если это не один из вариантов ответа.) 17.01.2019

Ответы:


1

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

Лучшим вариантом является хранение ваших данных в известном формате сериализации. Обычный формат, используемый для таких вещей, — JSON, потому что он аккуратно сопоставляется со структурами данных Perl, но вы также можете просто хранить ваши строки как строки (без синтаксиса Perl, такого как цитирование) для простого случая, подобного этому. Существует множество других вариантов, таких как YAML или даже XML, но их сложнее декодировать; и двоичные форматы, такие как Storeable, 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;
16.01.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..