如何从具有键值对的文件中获取键值的子集

时间:2014-08-05 19:00:32

标签: perl

我有一个由空格分隔的键值对的文件。文件中的第一列是键,其余列是值。换句话说,每个键可以有一个值的数组。

我只对文件中某些键的值感兴趣。我有一个数组,其中包含我感兴趣的键。在perl中创建只有我感兴趣的键/值对子集的哈希的最佳方法是什么?

这是我到目前为止所拥有的:

foreach my $line (@{$file_arr_ref}) {
    my $sub = substr( $line, 0, 1);
    if(($sub ne "#") and ($sub ne "")){ #omit comments and blank lines
        my @key_vals = split(/\s/, $line);
        if $key_vals[0] eq "key_i'm_interested_in_1" or $key_vals[0] eq "key_i'm_interested_in_2" {
            insert_into_hash();
        }
    }
}

有更优化的方法吗?

2 个答案:

答案 0 :(得分:1)

使用您需要的键从数组创建哈希。

my @keys_i_need = ('key_1', 'key_2', 'key_3');
my %keys_i_need = map {$_ => 1} @keys_i_need;

foreach my $line (@{$file_arr_ref}) {
    my $sub = substr( $line, 0, 1);
    if(($sub ne "#") and ($sub ne "")){ #omit comments and blank lines
        my @key_vals = split(/\s/, $line);
        insert_into_hash() if(exists $keys_i_need{$key_vals[0]});
    }
}

答案 1 :(得分:0)

通常情况下,当一个人在寻找某事物的存在时,人们应该想到的第一个数据结构就是哈希。

但是,如果项目列表很短,使用grep也可以使用数组。

foreach my $line (@{$file_arr_ref}) {
    next if $line =~ /^$/ || $line =~ /^#/;  # Omit blank lines and comments

    my @key_vals = split /\s/, $line;

    next if ! grep {$key_vals[0] eq $_} qw(key_one key_two key_three);

    insert_into_hash();
}

另请注意,如果您要在文件的所有行上进行迭代,那么最好以while (<$fh>)形式执行此操作,而不是先将它们全部加载到数组中。