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



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

我只对文件中某些键的值感兴趣。我有一个包含我感兴趣的键的数组。什么是最好的方式在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();
        }
    }
}

是否有更优的方法来做到这一点?

用你需要的键从数组中创建一个散列。

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]});
    }
}

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

但是,如果项目列表很短,使用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>)的形式进行迭代,而不是首先将它们全部加载到数组中。

最新更新