Perl哈希:使用外部文本文件中的键/值对

时间:2019-01-16 22:55:59

标签: file perl hash

我正在尝试创建一个哈希,以从服务器上的单独文本文件中绘制其键/值对。

当我在我的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 :(得分:2)

从文件中读取时,您将得到一个字符串(如果逐行读取,则将获得多个字符串)。 Perl解析器仅解析传递给Perl解释器的源代码,而不解析您从文件或其他地方读取的任何内容。您可以使用eval函数以perl代码的形式评估任意字符串,并返回最后一个表达式的结果(在这种情况下为字符串列表),但是string 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;