perl - 如何在 Perl 中将这些字符串转换为哈希?

标签 perl string parsing hash

我希望将具有多个分隔符的单个字符串转换为 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/

相关文章:

perl - 如何将参数传递给处理每个文件的 File::Find 子例程?

string - Perl 中有内置的 "hash to string"吗?

c# - 为什么 object.Equals 和 instanceobject.Equals 不一样

python如何将css文件解析为键值

javascript - 编写野牛语法以识别javascript函数并忽略其他所有内容

perl - 是否有比较可用于在 Perl 中开发 Web 应用程序的不同框架的功能的列表?

mysql - DBIx::Class 中右侧的 MySQL 函数

PHP 将数组中的重复项与多个字符串数据进行比较

c++ - 试图从内存中删除字符串。不会让我分配给 cin

c - 如何解决2+2和2++2冲突