我希望将具有多个分隔符的单个字符串转换为 key=>value 哈希结构。有没有一种简单的方法可以做到这一点?我目前的实现是:
sub readConfigFile() {
my %CONFIG;
my $index = 0;
open(CON_FILE, "config");
my @lines = <CON_FILE>;
close(CON_FILE);
my @array = split(/>/, $lines[0]);
my $total = @array;
while($index < $total) {
my @arr = split(/=/, $array[$index]);
chomp($arr[1]);
$CONFIG{$arr[0]} = $arr[1];
$index = $index + 1;
}
while ( ($k,$v) = each %CONFIG ) {
print "$k => $v\n";
}
return;
}
“配置”包含:
pub=3>rec=0>size=3>adv=1234 123 4.5 6.00
pub=1>rec=1>size=2>adv=111 22 3456 .76
最后的数字也需要删除,并保存在一个单独的 key=>value 对中,其名称可以是 'ip'。 (如果代码过于冗长和复杂,我无法做到这一点)。
最佳答案
您的配置数据结构应该是什么样的?到目前为止,解决方案只记录最后一行,因为它们每次添加记录时都会踩到相同的哈希键。
这可能会让你更接近,但你仍然需要弄清楚数据结构应该是什么。
我将文件句柄作为参数传入,因此我的子程序不会与获取数据的特定方式相关联。在这种情况下,它可以来自文件、字符串、套接字,甚至是 DATA 下面的内容。
我没有在解析字符串后进行修复,而是在解析字符串之前修复字符串以使其具有“ip”元素。一旦我这样做了,“ip”元素就不是特例了,它只是一个双重分割的问题。这是一项非常重要的技术,可以节省大量工作和代码。
我在子例程中创建了一个哈希引用,并在完成后返回该哈希引用。我不需要全局变量。 :)
use warnings; use strict; use Data::Dumper; readConfigFile( \*DATA ); sub readConfigFile { my( $fh ) = shift; my $hash = {}; while( <$fh> ) { chomp; s/\s+(\d*\.\d+)$/>ip=$1/; $hash->{ $. } = { map { split /=/ } split />/ }; } return $hash; } my $hash = readConfigFile( \*DATA ); print Dumper( $hash ); __DATA__ pub=3>rec=0>size=3>adv=1234 123 4.5 6.00 pub=1>rec=1>size=2>adv=111 22 3456 .76
这为您提供了一个数据结构,其中每一行都是单独的记录。我选择记录的行号($.
)作为顶级键,但你可以使用任何你喜欢的东西。
$VAR1 = { '1' => { 'ip' => '6.00', 'rec' => '0', 'adv' => '1234 123 4.5', 'pub' => '3', 'size' => '3' }, '2' => { 'ip' => '.76', 'rec' => '1', 'adv' => '111 22 3456', 'pub' => '1', 'size' => '2' } };
如果这不是您想要的结构,请告诉我们您希望最终得到什么,我们可以调整答案。
关于perl - 如何在 Perl 中将这些字符串转换为哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/275038/